2013-08-23 56 views
1

我想将变量合并到字典中存在的键中。 下面是规则:Python3中的条件合并

  1. 如果键已经存在,然后增加一个计数器的值。
  2. 如果与密钥部分匹配存在: a。如果可变长度小于键,但re.search不是无,则将值计数器增加一个 b。如果可变长度大于键和re.search较大不无,一个
  3. 如果后此变量存在,但仍然在字典中没有匹配替代由变量,增量计数键,添加变量字典

我已经能够完成1,2a和2b,但我不知道如何添加3.任何帮助/建议将不胜感激。 以下是目前形式的脚本:我还想在字典中看到“乌龟”。

Animals = ["phant", "eleph", "tiger", "turtle", "zebra", "ostrich"] 
Dict = {"horse":1, "elephant":1, "iger":1, "ostrich":1} 

for name in Animals: 
    if name in Dict: 
      Dict[name]=Dict[name]+1 
    else: 
      for key, val in Dict.items(): 
        if len(name) < len(key): 
          m = re.search (name, key) 
          if m != None: 
            print ("Found match!", name) 
            Dict[key] = Dict[key] + 1 
            break 
        elif len(name) > len(key): 
           m = re.search (key, name) 
           if m != None: 
            print ("Found match!", name) 
            Dict[name] = Dict.pop(key) + 1 
            Dict[name] = Dict[name] + 1 
            break 
+1

为什么啊,你为什么混合缩进级别?你在混合制表符和空格吗?并且(为了解决你正在询问的问题),一个普通的旧“else”怎么样? – inspectorG4dget

+0

当匹配发生时,添加一个'found'标志,该标志最初为'False',并设置为'True'。在'for'循环结尾处,查看'found'是否为'False',然后将键添加到字典中。 –

+0

谢谢Subhasis –

回答

1

一种方式来描述情况#3看代码后是“如果既没有break语句被处死”。您可以通过在for循环之后放置else语句来处理此情况。如果for循环运行完成该块内的代码才会执行​​(或者换句话说,没有break语句循环中运行):

Animals = ["phant", "eleph", "tiger", "turtle", "zebra", "ostrich"] 
Dict = {"horse":1, "elephant":1, "iger":1, "ostrich":1} 

for name in Animals: 
    if name in Dict: 
     Dict[name]=Dict[name]+1 
    else: 
     for key, val in Dict.items(): 
      if len(name) < len(key): 
       m = re.search (name, key) 
       if m != None: 
        print ("Found match!", name) 
        Dict[key] = Dict[key] + 1 
        break 
      elif len(name) > len(key): 
       m = re.search (key, name) 
       if m != None: 
        print ("Found match!", name) 
        Dict[name] = Dict.pop(key) + 1 
        Dict[name] = Dict[name] + 1 
        break 
     else:     # this line and the one below it are new 
      Dict[name] = 1 
+0

您是否试过运行它?它完全符合OP的要求,最后在'Dict'中包含''turtle'',其他所有内容都与之前相同。 –

+0

谢谢F.J.很高兴看到有很多可行的选择。我对python比较陌生,但很享受! –

+0

@ F.J你是对的。我没有注意到所有“正面”案件都以“休息”结束。对不起。 +1 –

0
for name in Animals: 
    if name in Dict: 
     Dict[name]=Dict[name]+1 
    else: 
     found= False 
     for key, val in Dict.items(): 
      if len(name) < len(key): 
       m = re.search (name, key) 
       if m != None: 
        print ("Found match!", name) 
        Dict[key] = Dict[key] + 1 
        found= True 
        break 
      elif len(name) > len(key): 
       m = re.search (key, name) 
       if m != None: 
        print ("Found match!", name) 
        Dict[name] = Dict.pop(key) + 1 
        found= True 
        break 
     if not found 
      Dict[name] = 1 

我宁愿以下,但:

for name in Animals: 
    if name in Dict: 
     Dict[name]=Dict[name]+1 
    else: 
     found= False 
     for key, val in Dict.items(): 
      m = re.search (name, key) 
      if m != None: 
       print ("Found match!", name) 
       if len(name) < len(key): 
        Dict[key] = Dict[key] + 1 
       else 
        Dict[name] = Dict.pop(key) + 1 
       found= True 
       break 
     if not found 
      Dict[name] = 1 
+0

谢谢!这工作完美。对不起,关于我的代码中的实验室空间问题。我正在使用凯特,它有时会将空格更改为制表符! –

+0

@RaviKumar检查第二个。略短,但也更容易维护(重复性较低)。 –

+0

谢谢,较长的脚本可以工作,但较短的脚本不能合并tiger和iger。我假设因为re.search在关键字中搜索名称,并且既存键(iger)较短,所以老虎保持分离。 –