簡體   English   中英

用字典解開參數

[英]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.

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