Python3:检查字典中的关键字是否与字符串的任何部分匹配

问题描述:

我无法将我的工作代码从列表转换为字典。代码的基础知识检查列表中任何关键字的文件名。Python3:检查字典中的关键字是否与字符串的任何部分匹配

但是我很难理解字典来转换它。我试图拉出每个键的名称,并将其与文件名比较,就像我对列表和元组所做的那样。这是我正在做的一个模拟版本。

fname = "../crazyfdsfd/fds/ss/rabbit.txt" 
hollow = "SFV" 
blank = "2008" 
empty = "bender" 

# things is list 
things = ["sheep", "goat", "rabbit"] 
# other is tuple 
other = ("sheep", "goat", "rabbit") 
#stuff is dictionary 
stuff = {"sheep": 2, "goat": 5, "rabbit": 6} 

try: 
    print(type(things), "things") 
    for i in things: 
     if i in fname: 
     hollow = str(i) 
     print(hollow) 
     if hollow == things[2]: 
      print("PERFECT") 
except: 
    print("c-c-c-combo breaker") 

print("\n \n") 
try: 
    print(type(other), "other") 
    for i in other: 
     if i in fname: 
      blank = str(i) 
      print(blank) 
      if blank == other[2]: 
       print("Yes. You. Can.") 
except: 
    print("THANKS OBAMA") 

print("\n \n") 
try: 
    print(type(stuff), "stuff") 
    for i in stuff:    # problem loop 
     if i in fname: 
      empty = str(i) 
      print(empty) 
      if empty == stuff[2]: # problem line 
       print("Shut up and take my money!") 
except: 
    print("CURSE YOU ZOIDBERG!") 

我能够通过前两个例子得到完整的运行,但是我无法让字典在没有异常的情况下运行。循环不会将空值转换为东西[2]的值。遗憾地在鱼苗的口袋里留下钱。让我知道,如果我的例子不够清楚,我所问的。该字典只是简短的计算列表并将文件添加到其他变量。

+0

在最后的'try'块中,您可能想分配而不是检查是否相等?我认为'empty == str(i)'应该是'empty = str(i)'。这不是主要问题,但需要考虑的事情 – davedwards

+0

我并不清楚你的目标是什么,但有一点,'fname'只是一个字符串,但'如果我在fname:'似乎想检查'我'在文件'fname'内容。也许字典行为的主要问题是,你知道字典有两个部分:'键'和'值',而你似乎正在将关键字与字典'键'进行比较,所以使用'for i in stuff。 ():'和'if empty == stuff.keys()[2]:' – davedwards

+0

所以对我来说,最后一个'try'块变成这样:'try: print(type(stuff) ,“东西”) 为我在东西。keys():#问题循环 if if open(fname).read(): empty = str(i) print('empty'+ empty) if empty == stuff.keys()[2]: #问题行 print(“闭嘴,拿我的钱!”)' – davedwards

A dictionary是将键映射到值的无序集合。如果定义stuff是:

stuff = {"sheep": 2, "goat": 5, "rabbit": 6} 

您可以参考它的元素有:

stuff['sheep'], stuff['goat'], stuff['rabbit'] 

stuff[2]将导致KeyError异常,因为密钥2没有在你的字典中找到。您无法将字符串与字典的最后一个或第三个值进行比较,因为字典未以有序序列存储(内部排序基于散列)。使用列表或元组作为有序序列 - 如果您需要与最后一项进行比较。

如果你想遍历一个字典,你可以使用它作为一个模板:

for k, v in stuff.items(): 
    if k == 'rabbit': 
     # do something - k will be 'rabbit' and v will be 6 

如果您要检查,以检查在字典中的钥匙,看它们是否匹配字符串的一部分:

for k in stuff.keys(): 
    if k in fname: 
     print('found', k) 

其他一些注意事项:

的KeyError异常会更容易注意到......如果你拿出你的try/except块。从最终用户隐藏python错误可能很有用。隐藏您的信息是一个糟糕的主意 - 尤其是当您在代码中调试初始传递时。

您可以比较在列表或元组的最后一个项目: if hollow == things[-1]: ,如果这是你想要做什么。

在您的上一个循环中:empty == str(i)需要为empty = str(i)

+0

你的意思是'for k,v in stuff.items()'? –

+0

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''可迭代,迭代已经结束了,所以'for stuff.keys()'与''for stuff''相同' –

+0

@azat yep,thanks –