gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:09:58 25 4
gpt4 key购买 nike

我一直在尝试比较两个字典列表,并在列表 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]

这实际上似乎非常有效,特别是考虑到我使用的列表可能包含 50,000 多个词典。然而,问题是:

如果它在 list2 中找到一个确实不在 list1 中的用户标识,它会将其添加到 newpeople(根据需要),但随后也会将 list2 中随后出现的所有其他用户标识也添加到 newpeople.

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

这让我非常困惑 - 如果有人能帮助我弄清发生这种情况的原因,我将不胜感激。

最佳答案

目前你已经设置list1tuplelist2tuple为:

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 - 使用元组比较字典列表 - 意外行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38964394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com