簡體   English   中英

在Python中,將包含關鍵字對的列表添加到字典的最簡單方法是什么?

[英]In Python, what is the easiest way to add a list consisting of keyword pairs to a dictionary?

我在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

似乎相似,但我覺得這是一個不同的問題,以保證單獨的回應。
我在這里做錯了什么,我該如何解決?
有更簡單的方法嗎?

如果你想從給定的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方法

試試這個:

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'}]

也許你想要一個listdict而不是一個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']}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM