【问题标题】:Check if string in list of strings equals one value in list in dictionary, then assign key value to variable检查字符串列表中的字符串是否等于字典列表中的一个值,然后将键值分配给变量
【发布时间】:2017-05-12 13:39:24
【问题描述】:

设置

我正在使用 Scrapy 进行抓取项目。

我有一个字符串列表,

l = ['john', 'jim', 'jacob', … ,'jonas']

还有一个包含列表的字典,

d = {
 'names1': ['abel', 'jacob', 'poppy'],
 'names2': ['john', 'tom', 'donald']
}


问题

我想检查l 中的每个名称是否包含在d 的列表之一中。如果是这样,我希望将d 中该列表的键分配给一个新变量。例如。 jacob 会得到 newvar = names1

现在我有,

found = False
for key,value in d.items():
     for name in l:
          if name == value:
              newvar = key
              found = True
              break
     else:
         newvar = 'unknown'
     if found:
         break

但是,这会导致l 中的每个name 都为newvar = 'unknown'

我认为我没有正确地跳出外部 for 循环。除此之外,是否有更优雅的方法来解决我的问题?

【问题讨论】:

  • 您确定要这样做吗?我的意思是你每次都想创建的新变量。
  • 是的,它是 Scrapy 蜘蛛的一部分:我稍后将 newvar 分配给字典。
  • 是把if name == value改成if name in value的问题吗?还是我读错了?因为在我看来 value 会有一个列表,而不是一个名字。
  • 为什么不立即将其分配给字典?
  • @Marcy 不,我试过了。不变。

标签: python dictionary for-loop


【解决方案1】:

我认为您遇到的问题是您想查看 l 中的任何字符串是否存在于 d 中的值中。您的代码现在假设该值是一个字符串,而不是一个列表,因此您试图进行比较,这将始终是错误的,因此将“未知”分配给每个值。试试下面的代码:

l = ['john', 'jim', 'jacob', 'jonas']
d = {'names1': ['abel', 'jacob', 'poppy'], 'names2': ['john', 'tom','donald']}
found = False
for a, b in d.items():
   for i in l:
       if i in b:
           d[a] = "unkown"
           flag = True
           break

   if flag:
   break

print d

这会给你:

{'names2': 'unkown', 'names1': ['abel', 'jacob', 'poppy']}

由于您跳出循环,因此只有一个键具有“未知”值,但是如果您想将 l 中包含字符串的每个值都替换为 unkown,这也可以:

final_dict = {a:"unkown" if i not in b else b for i in l for a, b in d.items()}

print final_dict

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-02
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多