你如何用Python中的列表来交叉检查字典?

时间:2011-06-28 17:12:24

标签: python list dictionary

说我有一个清单

list: [keith, roger, david], [5, nobody, 31], [attack, thomas, 4]

和字典

dictionary: '55': <Trachea>, 'Roger': <Bert>

我想删除字典中与列表列表的第二部分不匹配的项目。在这个例子中,我想要摆脱&#39;&#39;但不是&#39; Roger&#39;:。谢谢!

5 个答案:

答案 0 :(得分:5)

#!/usr/bin/python3

# myList = [['keith', 'roger', 'david'], [5, 'nobody', 31], ['attack', 'thomas', 4]]
# myDict = {'55': '...', 'roger': '...'}

secondElements = {x[1] for x in myList}

filteredDict = {k:v for k,v in myDict.items() if (k in secondElements)}

print(filteredDict)
# prints: {'roger': '...'}

有更快捷的方法可以做到这一点,但制作一个secondElements集会加快查询并使其O(1)时间。我编辑了您的列表,因为存在区分大小写问题,但您也可以使用(k.lower() in secondElements)

答案 1 :(得分:2)

OR:

seconds = set(x[1] for x in d)
dict((k,v) for k,v in dd.iteritems() if k.lower() in seconds)

每次都编辑不创建列表

答案 2 :(得分:0)

nested = [['keith', 'roger', 'david'], [5, 'nobody', 31], ['attack', 'thomas', 4]]
seconds = [row[1] for row in nested]
d = {'55': 'Trachea', 'Roger': 'Bert'}
d = dict(((key, val) for (key, val) in d.items() if key.lower() in seconds))

答案 3 :(得分:0)

创建一个中间集并检查它:

# create set to check against
seconds = set(x[1] for x in list_of_lists)

# remove matching keys
for k in my_dict.keys():
  if k not in seconds:
     delete my_dict[k]

易。在O(N)时间内运行,具有O(N)存储。 请注意,在您的示例中,大小写将不匹配('roger'!='Roger')

答案 4 :(得分:-1)

>>> dict_ = {'Roger': 'Bert', 55: 'trachea'}
a=[['keith', 'roger', 'david'], [5, 'nobody', 31], ['attack', 'thomas', 4]]
>>> def delete(x):
... del dict_[x]

>>> map(lambda x: delete(x),filter(lambda x:x not in a[1],dict_))