gpt4 book ai didi

Python3 : create selective copy of dictionary as a new dictionary

转载 作者:行者123 更新时间:2023-12-01 05:49:38 25 4
gpt4 key购买 nike

使用 Python 3.3.0,我从 csv 文件创建了一个“字典”(标题:ID;Col1;Col2;Col3;Col4;Col5):

ID;Col1;Col2;Col3;Col4;Col5
15345;1;1;nnngngn;vhrhtnz;latest
12345;12;8;gnrghrtthr;tznhltrnhklr;latest
90834;3;4;something;nonsens;latest
12345;34;235;dontcare;muhaha;oldone

带有代码

file = "test.csv" 
csv_file = csv.DictReader(open(file, 'r'), delimiter=';', quotechar='"')

我想将 ID = 12345 的行复制到新字典中,而不是复制到文件中。我真的需要复制到字典中,而不是列表中,因为我希望能够直接寻址列名称。我尝试这样做

cewl = {}
for row in csv_file:
if row['ID'] == '12345':
cewl.update(row)
print(cewl)

输出是:

{'ID': '12345', 'Col1': '34', 'Col2': '235', 'Col3': 'dontcare', 'Col4': 'muhaha', 'Col5': 'oldone'}

我的问题:仅复制 ID=12345 的第二行,省略第一行,我不知道为什么。

如果我通过复制到新列表中来尝试此操作(仅用于测试目的),则一切正常:

cewl = []
for row in csv_file1:
if row['ID'] == '12345':
cewl.append(row)
print(cewl)

输出是:

[{'Col3': 'gnrghrtthr', 'Col2': '8', 'Col1': '12', 'Col5': 'latest', 'Col4': 'tznhltrnhklr', 'ID': '12345'}, 
{'Col3': 'dontcare', 'Col2': '235', 'Col1': '34', 'Col5': 'oldone', 'Col4': 'muhaha', 'ID': '12345'}]

我不知道为什么复制到新字典中不起作用...似乎没有像 .add 或 .append 这样的方法用于 dictreader。

如何将数据复制到新字典中而不丢失任何行?

最佳答案

预期输出是什么?对于 dict 来说,这种行为是完全正常的;您正在用新值替换每个键的值。

如果您希望这些值成为每个匹配行的值的列表,则使用 defaultdict 会更容易使用 list 工厂:

from collections import defaultdict

cewl = defaultdict(list)

for row in csv_file:
if row['ID'] == '12345':
for k, v in row.items():
cewl[k].append(v)

print(cewl)

输出:

defaultdict(<class 'list'>, {'Col1': ['12', '34'], 'ID': ['12345', '12345'], 'Col2': ['8', '235'], 'Col5': ['latest', 'oldone'], 'Col4': ['tznhltrnhklr', 'muhaha'], 'Col3': ['gnrghrtthr', 'dontcare']})

defaultdictdict 的子类,因此 print(cewl['Col1']) 将打印 ['12 ', '34']

当您使用.update()时,您实际上做到了这一点:

for k, v in row.items():
cewl[k] = v

例如将 cewl 中的每个键设置为正在处理的行中找到的值。当处理最后一行时,它的值会覆盖前一行的值。

如果您只想过滤掉与特定 ID 条件匹配的行,那么将它们添加到列表中就完全没问题了。然后循环匹配的结果来处理它们:

for row in cewl:
# do something with matched row

或者您可以构建一个围绕 DictReader() 的生成器过滤器来为您进行过滤,这样您就不需要在内存中构建列表:

def rowfilter(reader, id):
for row in reader:
if row['ID'] == id:
yield row

for row in rowfilter(csv_file, '12345'):
# do something with matched row

关于Python3 : create selective copy of dictionary as a new dictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14830282/

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