[英]Argument unpacking with a Dict
我有一個要解析為Dict的CSV文件,以便可以將具有“ key”鍵的第一項解壓縮為一個變量,然后將其余的值解壓縮為鍵控語言的列表。 有沒有一種干凈的好方法?
我的CSV就像這樣:
key,english,spanish
wanna_play_a_game,"Wanna play a game?","¿Quiero jugar a un juego?"
something_else,"Hello!","hola!"
像這樣的Dict對象:
[{'key': 'wanna_play_a_game', 'english': 'Wanna play a game?', 'spanish': '¿Quiero jugar a un juego?'}, {'key': 'something_else', 'english': 'Hello', 'spanish': 'hola!'}]
我確實嘗試了一下,但隨后意識到字典的拆包並不相同(我認為),因為它們的排序不像列表那樣。 我是否使事情復雜化了,應該只將row['key']
保存到變量中,然后將其從dict中刪除? Python不是我的基本語言,所以我對語法的更多魔術知識不了解。
在意識到自己迷路之前,這就是我的初衷:
import csv
class Translate:
def __init__(self):
self.translations = self.readCSV('translations.csv')
def readCSV(self, filename):
with open(filename, 'rt') as csvfile:
reader = csv.DictReader(csvfile)
return [dict(d) for d in reader]
def parse(self, line):
# for t_key, *langs in self.translations:
# for k, (t_key, *langs) in self.translations:
# ... some magic function?
我試圖讓基本的東西是t_key
是"wanna_play_a_game"
和langs
是('english': 'Wanna play a game?', 'spanish': '¿Quiero jugar a un juego?')
開箱不是您想要的。 您應該只從字典彈出t_key
,然后遍歷其余部分。
t_key = langs.pop('key')
for key, value in langs.items():
...
您的問題被標記為Python 3.6,並且在3.6中, DictReader
返回OrderedDict
實例,因此,如果您只是將return [dict(d) for d in reader]
更改為return list(reader)
,則拆包實際上應該不是問題,否則您是將那些OrderedDict
轉換回常規無序dict
。
我在這里使用3.5進行了在線交互式Python shell測試:
>>> text = '''key,english,spanish
... wanna_play_a_game,"Wanna play a game?","¿Quiero jugar a un juego?"
... something_else,"Hello!","hola!"'''
>>> r = csv.DictReader(io.StringIO(text))
>>> ds = list(r)
>>> key, eng, esp = ds[0].values()
>>> key, eng, esp
('wanna_play_a_game', 'Wanna play a game?', '¿Quiero jugar a un juego?')
或者,如果語言的數量未知,則*
解壓縮到一個列表中:
>>> key, *langs = ds[1].values()
>>> key, langs
('something_else', ['Hello!', 'hola!'])
在您的情況下,您可能需要這樣做(還記得return list(reader)
):
for d in self.translations:
key, *langs = d.values()
# do stuff with key and langs
另外,您也可以使用dict-comprehension創建字典,將"key"
鍵的值映射到不同語言的翻譯的OrderedDict
:
>>> {d.pop("key"): d for d in ds}
{'wanna_play_a_game': OrderedDict([('english', 'Wanna play a game?'), ('spanish', '¿Quiero jugar a un juego?')]),
'something_else': OrderedDict([('english', 'Hello!'), ('spanish', 'hola!')])}
但是請注意,當您創建字典理解時,這會修改列表中的字典,這可能被認為是不好的做法,但是在這種情況下,考慮到您首先沒有保留對原始字典的引用,我認為可以使用。
您可以使用split()方法嘗試執行以下操作:
final_list=[]
with open('file.txt','r') as f:
for line_no,data in enumerate(f):
if line_no==0:
pass
else:
dict_1 = {}
key,english,spanish=data.split(',')
dict_1['key'] = key
dict_1['English'] = english
dict_1['Spanish']=spanish.strip('\n')
final_list.append(dict_1)
print(final_list)
輸出:
[{'English': '"Wanna play a game?"', 'key': 'wanna_play_a_game', 'Spanish': '"¿Quiero jugar a un juego?"'}, {'English': '"Hello!"', 'key': 'something_else', 'Spanish': '"hola!"'}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.