Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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_Tuples - Fatal编程技术网

Python-使用元组比较字典列表-意外行为?

Python-使用元组比较字典列表-意外行为?,python,list,dictionary,tuples,Python,List,Dictionary,Tuples,我一直在尝试比较两个字典列表,并在列表2中查找不在列表1中的新用户的用户ID。例如,第一个列表: list1 = [{"userid": "13451", "name": "james", "age": "24", "occupation": "doctor"}, {"userid": "94324""name": "john", "age": "33", "occupation": "pilot"}] 第二个清单: list2 = [{"userid": "13451", "name": "

我一直在尝试比较两个字典列表,并在列表2中查找不在列表1中的新用户的用户ID。例如,第一个列表:

list1 = [{"userid": "13451", "name": "james", "age": "24", "occupation": "doctor"}, {"userid": "94324""name": "john", "age": "33", "occupation": "pilot"}]
第二个清单:

list2 = [{"userid": "13451", "name": "james", "age": "24", "occupation": "doctor"}, {"userid": "94324""name": "john", "age": "33", "occupation": "pilot"}, {"userid": "34892", "name": "daniel", "age": "64", "occupation": "chef"}]
所需输出:

newpeople = ['34892']
这就是我所做的:

list1tuple = ((d["userid"]) for d in list1)
list2tuple = ((d["userid"]) for d in list2)

newpeople = [t for t in list2tuple if t not in list1tuple]
这实际上似乎相当有效,特别是考虑到我正在使用的列表可能包含50000多个字典。然而,问题是:

如果它在列表2中发现一个确实不在列表1中的用户ID,它会将其添加到newpeople(根据需要),然后还会将列表2中随后出现的所有其他用户ID添加到newpeople

因此,假设list2包含600个用户标识,而list2中的第500个用户标识在list1中的任何位置都找不到,newpeople中的第一项将是第500个用户标识(同样,根据需要),但随后是新用户标识之后的其他100个用户标识


这让我很困惑——我非常感谢任何人帮助我弄清为什么会发生这种情况

目前您已将
list1tuple
list2tuple
设置为:

list1tuple = ((d["userid"]) for d in list1)
list2tuple = ((d["userid"]) for d in list2)
这些是生成器,而不是列表(或元组),这意味着它们只能迭代一次,这导致了您的问题

您可以将它们更改为列表:

list1tuple = [d["userid"] for d in list1]
list2tuple = [d["userid"] for d in list2]
这将允许您对它们进行任意次数的迭代。但更好的解决方案是简单地将它们设置为:

list1tuple = set(d["userid"] for d in list1)
list2tuple = set(d["userid"] for d in list2)
然后取设定差

newpeople = list2tuple - list1tuple

目前您已将
list1tuple
list2tuple
设置为:

list1tuple = ((d["userid"]) for d in list1)
list2tuple = ((d["userid"]) for d in list2)
这些是生成器,而不是列表(或元组),这意味着它们只能迭代一次,这导致了您的问题

您可以将它们更改为列表:

list1tuple = [d["userid"] for d in list1]
list2tuple = [d["userid"] for d in list2]
这将允许您对它们进行任意次数的迭代。但更好的解决方案是简单地将它们设置为:

list1tuple = set(d["userid"] for d in list1)
list2tuple = set(d["userid"] for d in list2)
然后取设定差

newpeople = list2tuple - list1tuple

从python控制台可以看出,list1tuple和list2tuple是生成器:

>>> ((d["userid"]) for d in list1)
<generator object <genexpr> at 0x10a9936e0>
您现在可以检查组中的成员资格:

>>> [t for t in list2generator if t not in list1set]
['34892']

从python控制台可以看出,list1tuple和list2tuple是生成器:

>>> ((d["userid"]) for d in list1)
<generator object <genexpr> at 0x10a9936e0>
您现在可以检查组中的成员资格:

>>> [t for t in list2generator if t not in list1set]
['34892']

list1tuple既不是元组也不是列表,它是一个生成器。。。那是你的problem@donkopotamus有趣的是,我实际上运行了type(list1tuple)并得到了generator,这让我更加困惑。你介意为我指出如何解决这个问题/实现我的目标的方向吗?thankslist1tuple既不是元组也不是列表,它是一个生成器。。。那是你的problem@donkopotamus有趣的是,我实际上运行了type(list1tuple)并得到了generator,这让我更加困惑。你介意为我指出如何解决这个问题/实现我的目标的方向吗?谢谢有道理的,谢谢!问:这不是list1tuple/list2tuple中的附加括号吗?这很有意义,谢谢!问题:这不是list1tuple/list2tuple中的附加括号吗?