Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用Python中的列表交叉检查词典?_Python_List_Dictionary - Fatal编程技术网

如何用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]