gpt4 book ai didi

python - 打开同一文件并评估其内容大小,多次运行会产生不同的结果

转载 作者:太空宇宙 更新时间:2023-11-03 15:33:44 25 4
gpt4 key购买 nike

我正在计算同一备份文件中某些对象的出现次数:

with open(file_path, encoding='utf-8') as data:
backend_data = json.load(data)
users = {}
sessions = {}

for key in backend_data.keys():
users.update(backend_data[key]['users'])

for key, value in users.items():
if 'session' in value:
sessions.update(value['session'])

print(len(users))
print(len(sessions))

虽然我总是为用户获得相同的len结果,但 session len几乎每次都不同我调用我的脚本。

该文件位于我的硬盘上,并且在运行期间没有以任何方式更改。以下是 5 次运行的一些示例结果:

// 1.
users: 819
sessions: 2373

// 2.
users: 819
sessions: 1995

// 3.
users: 819
sessions: 2340

// 4.
users: 819
sessions: 2340

// 5.
users: 819
sessions: 2069

有关该文件的一些附加信息:长度为 34535 行,大​​小为 959kb

当我多次运行脚本时,为什么一个字典会得到不同的值,而另一个字典却不会得到不同的值?

最佳答案

我可能知道发生了什么:

由于您使用自然顺序迭代字典,并且不能保证字典的顺序,因此更新时可能会产生一些令人讨厌的副作用。

在运行之间,由于默认情况下随机的哈希种子,顺序可能会发生变化(请参阅 Why items order in a dictionary changed in Python? )。

backend_data[key]['users'] 是一个字典,可能有一些键作为列表。根据顺序,某些列表会被其他列表覆盖,或者反过来,这不会改变第一个字典的长度。

但是,当您迭代值(第二个循环)时,您可能会在第二个字典中输入不同的数据。

要解决这个问题,您必须对可迭代对象进行排序:

with open(file_path, encoding='utf-8') as data:
backend_data = json.load(data)
users = {}
sessions = {}

for key,bd in sorted(backend_data.items()):
users.update(bd['users'])

for key, value in sorted(users.items()):
if 'session' in value:
sessions.update(value['session'])

(注意第一个循环的轻微优化:不要访问键,可以使用items(),并在元组上排序,这与在键上排序相同)

请注意,从 Python 3.6 开始,字典顺序被保留,因此不会出现问题。

也就是说,由于某些值会覆盖其他值,因此您的程序存在概念错误,因为您没有使用所有数据,并且您无法控制正在使用哪些部分以及要丢弃哪些部分。

关于python - 打开同一文件并评估其内容大小,多次运行会产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42704425/

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