Python3: create selective copy of dictionary as a new dictionary
使用python3.3.0,我从csv文件(header:ID;Col1;Col2;Col3;Col4;Col5创建了一个"字典"):
1 2 3 4 5
| 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 |
用代码
1 2
| file ="test.csv"
csv_file = csv.DictReader(open(file, 'r'), delimiter=';', quotechar='"') |
我想把id=12345的行复制到新字典中,而不是文件中。我真的想把它复制到字典中,而不是列表中,因为我想能够直接寻址列名。我试着这么做
1 2 3 4 5
| cewl = {}
for row in csv_file:
if row['ID'] == '12345':
cewl.update(row)
print(cewl) |
输出为:
1
| {'ID': '12345', 'Col1': '34', 'Col2': '235', 'Col3': 'dontcare', 'Col4': 'muhaha', 'Col5': 'oldone'} |
我的问题:只有ID=12345的第二行被复制,第一行被省略了,我不知道为什么。
如果我通过复制到一个新的列表(只是为了测试目的)来尝试这个方法,那么一切都可以正常工作:
1 2 3 4 5
| cewl = []
for row in csv_file1:
if row['ID'] == '12345':
cewl.append(row)
print(cewl) |
输出为:
1 2
| [{'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这样的方法用于dictleader。
如何将数据复制到新字典中而不丢失任何行?
- 字典是一种映射;决定是否要将一个ID("12345")映射到两个或多个不同的数据块,如您的示例中所示,在这种情况下,您可以将一个ID映射到一个字典列表,其中包含键Col1、Col2等的值的不同映射,或者类似于元组(ID, Col1, Col2, etc)的列表。在编写任何代码之前先考虑数据结构。
预期产量是多少?对于一个dict来说,这种行为是完全正常的;您正在用一个新值替换每个键的值。
如果您希望值是每个匹配行的值列表,那么使用defaultdict和list工厂更容易:
1 2 3 4 5 6 7 8 9 10
| 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) |
此输出:
1
| defaultdict(<class 'list'>, {'Col1': ['12', '34'], 'ID': ['12345', '12345'], 'Col2': ['8', '235'], 'Col5': ['latest', 'oldone'], 'Col4': ['tznhltrnhklr', 'muhaha'], 'Col3': ['gnrghrtthr', 'dontcare']}) |
defaultdict是dict的一个子类,因此print(cewl['Col1'])将打印['12', '34']。
当您使用.update()时,可以有效地执行以下操作:
1 2
| for k, v in row.items():
cewl[k] = v |
例如,将cewl中的每个键设置为在正在处理的行中找到的值。当处理最后一行时,它的值将覆盖前一行的值。
如果您只想筛选出符合特定ID条件的行,那么将它们添加到列表中就非常好了。然后循环匹配的结果以处理它们:
1 2
| for row in cewl:
# do something with matched row |
或者,您可以构建一个生成器过滤器,将它环绕在您的DictReader()上,以便为您进行筛选,因此您不需要在内存中构建列表:
1 2 3 4 5 6 7
| 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 |
- "dacoda:Python对象映射到一个映射的键的值。在进入操作系统somedict['a'] = 1(someddict['a'] = 2意味着你的价值'a'替换是最关键的。我给你提出的解决方案的列表值,添加到列表中的项目,我们认为,我们发现他们。我不相信你的技术工作,了解Python的映射。
- 如果你期望你的词典列表,然后添加到列表中使用的行和这相反。
- "我是dacoda:读你的评论就能够精细的答案时,请将未编辑的评论。我想让你给我确切的预期产出,你已经取得了(因为没有什么像这一样,但是不明确的。
- 谢谢,我想我的字典创建的副本,包括只有线与ID = 12345系统预期的产出,这应该是cewl案例和两线的头,每个具有相应的ID的12345一日期。
- "dacoda:你想的是什么?滤波csv文件写出来吗?给你的DictReaderdict样序列的对象列表,每个具有相同的输出,每个键的行。你需要的是多clearer,你是想我的,我只是在猜测。
- 我想选择某行:从CSV文件和复制他们到"临时建筑"可以与I(不是文件)。的CAN通讯。由于dictreader柱直接更好的名字,似乎对工作对象的创建和dictreader这样。我发现很多的教程关于如何选择某条dictreader CSV和写作对他们使用新的CSV文件使用dictwriter。但我只是想创建一个新的日期是相同的,这对我会得到他们对写作不写作文件,他们只是为新创建的文件,我可以继续工作了。
- 我的操作系统是基本的问题:我怎么复制一个线从与ID = 12345成一新的吗?我怎么能得到对方的"Add"两线/线单独的条目?
- "dacoda:单独的条目均系或是什么?我的解决方案给你的列表,按键,我们添加到每个键的值。这样你得到的柱,每个列表中的值,发现在CSV格式。什么是你想在你的你的CSV文件加载?
- "如果你想dacoda生产线:那些与你的工作清单,然后你找的一项是([firstmatchinglinedict, secondmatchinglinedict, etc.])。
- 回复:我的第一行打印出的《我与ID = I get:{"12345":"tznhltrnhklr COL4,col5":"最新的"、"下":"8","col3 gnrghrtthr‘:’’,’’’,12’,COL1:编号:"12345"}和{ muhaha COL4‘:’’’,’’’:col5交接","下":"235","col3 dontcare‘:’’‘‘:’COL1 34","身份":"12345"}。这就是我想要的是在我的新的...sorry,*我想成为粗鲁,但这是很难获得的操作系统吗?也许我的解释,它的错误的方式。我只是想复制:)某些行的另一个一对一的copied。的:)
- 你可以的"T"dacoda:复制到另一个,和期望的值保持到老。我给你两个选择,要么把值对列表或不复制,在第一dicts)的地方,只是他们的名单(这是为你而做的(启动)。我不能帮助你的事情是不可能的。
- 嗯,我在想:是相似的,但copy.deepcopy(解决),一个副本的整个字典。不知何故,它应该是可能的,只有实现这的某些行的I /线,但我们的讨论后,我开始思考,这是不是在这样的路。的:)
- 它是不是在复制的问题。这是你所期望的结果,是在复制。
- 另一个方法:好的,我会想象):我只是复制和删除所有条目中,除了那些与一个新的id为12345。的结果将是相同的,只是另一种方式来获得在那里。我的问题是,我能’t地址列在名单的名字,但我需要的那些在我的新工作,继续与它没关系,我想用新的;我只是想要。。。。。。。)我的"偏"的拷贝,这是它。的:)
- 我想你误解了DictReader()给你的。它不会给你一个dict。它提供了一系列dict对象。每个键都完全相同,但值不同。因此,每一个都不同于前一个。当您将这些添加到一个列表中时,您仍然可以访问该新系列dict对象中的键;只需循环该列表即可。
- 我认为实现dicts的+操作符可能会更准确地描述我想要实现的事情,如stackoverflow.com/questions/6416131/&hellip;:)…听起来不错,没什么帮助。:)
- @达柯达:问题是第二个dict的键完全相同。dict只能包含每个唯一键的一个副本。
- :但是newdict=olddict.copy()呢?两个听写机都有相同的按键,工作起来很有魅力。我的dict需要row.add-或row.append方法。
- 正如我所说,问题不在于复制。正是在你用同样的键来听另一个口述的时候,你误解了会发生什么。