在 Python 中,将由关键字对组成的列表添加到字典中的最简单方法是啥?

Posted

技术标签:

【中文标题】在 Python 中,将由关键字对组成的列表添加到字典中的最简单方法是啥?【英文标题】:In Python, what is the easiest way to add a list consisting of keyword pairs to a dictionary?在 Python 中,将由关键字对组成的列表添加到字典中的最简单方法是什么? 【发布时间】:2015-05-22 02:24:26 【问题描述】:

我有一个 Python 作业问题。 我在 Linux 上使用 Python 3.4.0 版。 设计文档声明我将使用内置函数读取 CSV 文件,指定为 names.dat,格式为:

name:name2, name:name3, name2:name4, name3:name5\n (etc)

然后我将这些关键字对添加到字典中,这是我坚持的部分。 到目前为止我的代码是这样的:

dictionary = dict()
database = open('names.dat', 'r')
data = database.read()
data = data.rstrip('\n')
data = data.split(',')
for item in range(len(data)):
    dictionary.update(data[item-1])

我的想法是,如果我有一个格式为“name:name2”的列表元素,并且我以该元素作为参数调用字典更新函数,它将正确映射到字典中的关键字对。 但是,情况并非如此,因为我在运行此脚本时收到此错误:

File "MyName.py", line 7, in <module>
    dictionary.update(data[item-1])
ValueError: dictionary update sequence element #0 has length 1; 2 is required

This 和 This 看起来很相似,但我觉得这是一个不同的问题,需要单独回答。 我在这里做错了什么,我该如何解决? 有没有更简单的方法来做到这一点?

【问题讨论】:

【参考方案1】:

如果你想从给定的 csv 创建一个精确的数据集,@Paulo Scardine 有一个很好的答案。如果您想根据键组合值,可以使用:

changes = 
with open('test.csv', 'r') as f:
    for row in f:
        for e in row.rstrip('\n').split(", ") : #split lines by column
            print (e) #just to show what is being generated here
            (k,v) = e.split(":") #split further into key, value pairs
            changes.setdefault(k, []).append(v)
            #creates empty list if new key, adds value to list

print (changes)

数据将如下所示:

'name3': ['name5'], 'name2': ['name4', 'name6', 'name5'], 'name1': ['name', 'name4'], 'name': ['name2', 'name3']

这可以进一步简化,但我认为这是学习者可以效仿的好例子。

编辑:在@Paulo Scardine 评论之后添加了 setdefault 方法

【讨论】:

这个成语在 Python 中很常见,以至于有一些语法糖:见dict.setdefaultcollections.defaultdict 很好,我一直在为我的 AI 课程从 R 迁移到 Python,这些方法可能会在路上为我省去一些麻烦【参考方案2】:

试试这个:

data = []
with open('names.dat') as database:
    for line in database:
        if line.strip():  # skip blank lines
            data.append(
                dict(i.split(":") for i in line.rstrip('\n').split(","))
            )

如果您的文件是:

name:name2,name:name3,name2:name4,name3:name5
name:name2,name:name3,name2:name4,name3:name5
name:name2,name:name3,name2:name4,name3:name5
name:name2,name:name3,name2:name4,name3:name5

data 将是:

['name': 'name3', 'name2': 'name4', 'name3': 'name5',
 'name': 'name3', 'name2': 'name4', 'name3': 'name5',
 'name': 'name3', 'name2': 'name4', 'name3': 'name5',
 'name': 'name3', 'name2': 'name4', 'name3': 'name5']

也许您想要list 中的dict 而不是dict 中的list

data = 
with open('names.dat') as database:
    for line in database:
        if line.strip():  # skip blank lines
            for k, v in (i.split(":") for i in line.rstrip('\n').split(",")):
                data.setdefault(k, []).append(v)

结果:

'name': [ 'name2', 'name3', 'name2', 'name3', 'name2', 'name3', 'name2', 'name3'],
 'name2': ['name4', 'name4', 'name4', 'name4'],
 'name3': ['name5', 'name5', 'name5', 'name5']

【讨论】:

以上是关于在 Python 中,将由关键字对组成的列表添加到字典中的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Python:将关键字保存在列表中并将另一个列表添加到其中的单个单词中[关闭]

能否将由纯静态 HTML 组成的网站搭建在 GitHub 上

如何将由 NE 和 SW 坐标组成的特定边界拟合到可见地图视图中?

将由多条线组成的标签垂直居中于 D3 力有向图中的节点上

将由单个数字和序列组成的字符串转换为允许对向量或数据帧进行子集化的格式

python