如何用Python中的列表交叉检查词典?
假设我有一张清单如何用Python中的列表交叉检查词典?,python,list,dictionary,Python,List,Dictionary,假设我有一张清单 list: [keith, roger, david], [5, nobody, 31], [attack, thomas, 4] 还有一本字典 dictionary: '55': <Trachea>, 'Roger': <Bert> 字典:'55':,'Roger': 我想删除字典中与列表第二部分不匹配的项。在这个例子中,我想去掉“55”:但不是“Roger”:。谢谢 #!/usr/bin/python3 # myList = [['keith
list: [keith, roger, david], [5, nobody, 31], [attack, thomas, 4]
还有一本字典
dictionary: '55': <Trachea>, 'Roger': <Bert>
字典:'55':,'Roger':
我想删除字典中与列表第二部分不匹配的项。在这个例子中,我想去掉“55”:但不是“Roger”:。谢谢
#!/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)
time。我编辑您的列表是因为存在区分大小写的问题,但您也可以使用(secondElements中的k.lower())
有更快的方法可以做到这一点,但是设置一组secondElements
将加速查询,并使其O(1)
time。我编辑您的列表是因为存在区分大小写的问题,但您也可以使用(secondElements中的k.lower())
或:
每次编辑为不创建列表,或:
每次编辑为不创建列表创建一个中间集并对照它进行检查:
# 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')创建一个中间集并对照它进行检查:
# 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')
>dict.={'roger':'Bert',55:'trach'}
a=[['keith','roger','david',[5','nobody',31','attack','thomas',4]]
>>def delete(x):
... del dict_ux[x]
>>map(lambda x:delete(x),filter(lambda x:x不在[1]中,dict中))
>dict={'Roger':'Bert',55:'tracha'}
a=[['keith','roger','david',[5','nobody',31','attack','thomas',4]]
>>def delete(x):
... del dict_ux[x]
>>映射(lambda x:delete(x),filter(lambda x:x不在[1]中,dict_))
什么是“列表的第二部分”?您是指每个子列表中的第二项,还是第二个子列表?无论如何,为什么这么难?迭代字典中的对,检查键是否存在于列表的适当部分。或者,如果是一个大列表,则将适当的比较器项读入它们自己的哈希表中。哈哈,在python中,它们只是一种方法。你挑吧。你说的“名单的第二部分”是什么意思?您是指每个子列表中的第二项,还是第二个子列表?无论如何,为什么这么难?迭代字典中的对,检查键是否存在于列表的适当部分。或者,如果是一个大列表,则将适当的比较器项读入它们自己的哈希表中。哈哈,在python中,它们只是一种方法。根据您的选择。实际上,这将失败,因为字符串比较不区分大小写,让我编辑它一点。实际上,这将失败,因为字符串比较不区分大小写,让我编辑它一点。这将为d中的x重新创建列表[x[1]
,当O(N)时,会产生O(N^2)
算法
算法是可能的。与其他O(N^2)
实现相比,由于在和列表中使用了,它的速度也将是其他O(N^2)
实现的两倍。这并不是说它是一个不好的解决方案,如果它的大小很小,它肯定是简洁的time@Artsiom当前位置我想取消否决票,但那不是我的。还要注意的是,.iteritems()
被弃用,取而代之的是简单的.items()
@ninjagecko,我认为您每次创建一个新列表都是错误的。我测试了它,它只创建了一次列表。@senderle:真奇怪。。。我用[x代表范围(5)内的x,如果x在[(lambda:print(1))(),3]]
测试了它,它多次重新评估查询。也许编译器在我们背后优化某些东西!编辑:我仍然认为我是正确的:millionRange=range(10**6);[x代表范围内的x(100),如果x在[y代表y在百万范围内]
比范围(5)
慢得多。这将每次为d中的x重新创建列表[x[1]
,当O(N)
算法可行时,将产生O(N^2)
算法。与其他O(N^2)
实现相比,由于在
和列表中使用了,它的速度也将是其他O(N^2)
实现的两倍。这并不是说它是一个不好的解决方案,如果它的大小很小,它肯定是简洁的time@Artsiom当前位置我想取消否决票,但那不是我的。还要注意的是,.iteritems()
被弃用,取而代之的是简单的.items()
@ninjagecko,我认为您每次创建一个新列表都是错误的。我测试了它,它只创建了一次列表。@senderle:真奇怪。。。我用[x代表范围(5)内的x,如果x在[(lambda:print(1))(),3]]
测试了它,它多次重新评估查询。也许编译器在我们背后优化某些东西!编辑:我仍然认为我是正确的:millionRange=range(10**6);[x代表范围内的x(100),如果[y代表范围内的y]
比range(5)
'secondElements={x[1]代表myList中的x}'这一行在Python2.6/2.7中抛出了一个异常,因为某种原因python说symbVol}中的secondElements={x[1]代表x^syntaxer:无效语法。。这个问题对某些人来说是个问题reason@Fred:您只需执行set(myList中x的x[1])
和dict((k,v)在myDict.items()中的k,v)(如果(SecondElements中的k))
。为了清晰起见,我使用python3语法来理解set和dict,这相当于python2.X'secondElements={X[1]表示myList中的X}这一行在python2.6/2.7中抛出了一个异常,因为某种原因,python说secondElements={X[1]表示symbVol中的X}^SyntaxError:无效语法。。问题是我
# 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]