【问题标题】:loop over keys and add missing values循环键并添加缺失值
【发布时间】:2021-04-27 03:57:38
【问题描述】:

我正在将 csv 文件转换为字典,两个 csv 文件相似但具有不同的值。所以一个csv文件有{name, state, website},另一个有{name, state, car}。这些文件中有一些相同的人,所以我想遍历键,如果它们具有相同的名称,则添加缺少的键,例如,如果两者都有一个名叫 John Williams 的人,它将找到该名称并创建一个新字典说 {name: 'John Williams', state: 'FL", website "https://helpmeplease.com", car: "Kia"}. 如果有新人,那么我希望它创建一个新行并添加它进入字典。

我已将 csv 文件转换为字典,目前我正在比较关键的“名称”,但我被困在了这里,不知道从这里去哪里。

import csv
filename1 ="example.csv"
filename2 = "example2.csv"

blue = {}

with open(filename1, 'r', newline='') as f:
 for line in csv.DictReader(f):
    blue[line['name']] = line

with open(filename2, 'r', newline='') as h:
 for line in csv.DictReader(h):
    if line['name'] in blue.keys():
      #This is where I'm stuck
    else:
        blue[line['name']] = line

【问题讨论】:

  • fire[line['name']].update(line)
  • 您还可以通过将fire 设置为defaultdict(dict) 来简化此操作;那么您可以只运行两个 CSV 并对所有条目执行update,而不必测试它们是否已经存在。我会继续发布一个答案,说明它是如何工作的......

标签: python loops csv dictionary key


【解决方案1】:

您可以使用dict.update 将一个字典的内容合并到另一个字典中。我还使用defaultdict 来管理字典的字典,从那时起您可以合并数据而无需检查是否需要先创建字典。

import csv
from collections import defaultdict

filenames = ["example.csv", "example2.csv"]

fire = defaultdict(dict)  # type: Dict[str, Dict[str, str]]

for filename in filenames:
    with open(filename, 'r', newline='') as f:
        for row in csv.DictReader(f):
            fire[row['name']].update(row)

请注意,如果您有 filename1filename2 之类的变量,并且复制+粘贴的代码对它们两者/全部都执行大致相同的操作,则通常是一个很好的线索,您应该使用列表和 @ 987654326@ 循环代替! :)

【讨论】:

  • 谢谢你,这对我有用,我还是编程领域的新手,非常感谢你的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多