【问题标题】:Python comprehension for dictionary with String key and List valuesPython对带有字符串键和列表值的字典的理解
【发布时间】:2020-01-24 14:46:52
【问题描述】:

我正在寻找理解来阅读 csv 并创建一个字典,其中键是字符串,值是列表

csv 看起来像

fruit,Apple
vegetable,Onion
fruit,Banana
fruit,Mango
vegetable,Potato

我的输出应该是这样的

{'fruit':['Apple','Banana','Mango'],'vegetable':['Onion','Potato']}

我正在寻找字典理解来做到这一点,我试过了

def readCsv(filename):
    with open(filename) as csvfile:
        readCSV = csv.reader(csvfile, delimiter='\t')
        dicttest={row[1]:[].append(row[2]) for row in readCSV}
        return dicttest

【问题讨论】:

  • 请注意,您的分隔符与您的示例不匹配。您的示例数据有逗号,但您在 CSV 阅读器中使用标签。另外请注意,您的示例文件有两列将被 0 和 1 索引。在您的代码中,您是 1 和 2 的索引。
  • 还要注意@elomat 的有效答案中使用了简单的 for 循环。这是这里最明显的方法。字典理解是不合适的。 (它可以用于对整个输入进行排序并使用带有 lambda 函数的 itertools.groupby,但与发布的解决方案相比,它的内存效率较低且性能可能较低。)
  • 感谢性能部分的建议,字典理解思路我省略了

标签: python-3.x dictionary dictionary-comprehension


【解决方案1】:

您好,这是您想要实现的目标吗?

import csv
def readCsv(filename):
    d = {}
    with open(filename) as csvfile:
        readCSV = csv.reader(csvfile, delimiter='\t')

        for row in readCSV:
            d.setdefault(row[0], []).append(row[1])
    return d

print(readCsv('test.csv'))

【讨论】:

  • 重要的是要注意,如果 OP 在创建阅读器时指定正确的分隔符,r = row[0].split(',') 是不必要的。有可能 OP 在他的示例中显示逗号分隔以用于显示目的,但他的真实数据实际上使用了制表符。如果是这样,OP 应该跳过该行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 2021-11-10
  • 2020-09-04
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2013-08-31
相关资源
最近更新 更多