Python 用口述解压论点

Python 用口述解压论点,python,python-3.6,Python,Python 3.6,我有一个CSV文件,我想将其解析为Dict,这样第一个键为“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', 'e

我有一个CSV文件,我想将其解析为Dict,这样第一个键为“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!'}]
我确实试过了,但后来意识到,解包与dict(我想)不一样,因为它们不像列表那样排序。我是否过于复杂,应该将
行['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
成为
“想玩游戏”
langs
成为
(“英语”:想玩游戏?,“西班牙语”:你不想在这里拆包。您只需从dict中弹出
t_键
,然后迭代其余部分

t_key = langs.pop('key')
for key, value in langs.items():
    ...

您可以使用split()方法尝试以下操作:

输出:

[{'English': '"Wanna play a game?"', 'key': 'wanna_play_a_game', 'Spanish': '"¿Quiero jugar a un juego?"'}, {'English': '"Hello!"', 'key': 'something_else', 'Spanish': '"hola!"'}]

您的问题被标记为Python3.6,在3.6中,返回实例,因此,如果您只是将
return[dict(d)for d in reader]
更改为
return list(reader)
,则解包实际上应该不是问题,否则您将把那些
OrderedDict
转换回常规无序
dict

使用测试,因为我在这里坚持使用3.5:

>>> 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!'])
在您的情况下,您可能需要这样做(还记得
返回列表(读卡器)
):


或者,您也可以使用dict理解创建一个字典,将
“key”
键的值映射到不同语言翻译的
有序dict

>>> {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!')])}

但是,请注意,在创建词典理解时,这会修改列表中的词条,这可能被视为不好的做法,但在这种情况下,考虑到您首先没有保留对原始词条的引用,我认为这是可以使用的。

您的代码到底做错了什么?您的问题被标记为Python 3.6。在3.6中,应该实际返回
OrderedDict
实例,因此,如果您只是将
return[dict(d)for d In reader]
更改为
return list(reader)
,那么解包应该不会有问题。好吧,您正在尝试构建嵌套字典?类似于
[{not_key':'want_play_a_game','langs':{'english':'want play a game?,'spanish':'Quiero jugar a un juego?',…]
@glibdud我在问,是否有一种方法可以像速记语法一样解压论点,就像你可能用列表,但用口述。我不认为这个问题离题,宽泛或不清楚(至少就个人而言)嵌套字典可能也很不错。我主要来自JS/Node,对以前从未见过的
OrderedDict
之类的东西有点困惑。而且似乎
list()
对使用py2和py3.6Ah的人做了一些不同的事情,我正试图做类似的事情(非捷径),但我想可能是我的dict仍被作为引用传递?或者是与弹出它有关的东西使它在下一个循环中中断。它似乎正在发生变异,但也可能是一个空键的无用行。非常感谢,我认为这让我走上了正确的轨道。然而,我得到了
“list”对象没有属性值“
在self.translations.values()中使用
键时,*langs:
我将
readCSV
方法更改为使用
return list(reader)
,正如您上面提到的^^^^@MattFletcher注意,您正在执行
self.translations.values()
,而我的代码对应于
self.translations[0].values()
,即从列表中的dict中获取
值,而不是列表本身。当然,在您的情况下,您可能应该在self.translations:key中为d使用类似
的循环,*lang=d.values()
是的!就是这个。啊,我现在觉得自己很愚蠢,因为我试图在列表上运行dict函数……但是,是的,代码工作正常,正是我所要求的,超级干净和可爱。非常感谢。我想我已经订购了那些奇美拉
的dict
-s更多了这是如何解决OPs问题的?你只是在更换经过测试和验证的
csv.DictReader
和您自己的实现。在对问题的评论中,我们也讨论了很多要求,例如没有指定语言的键,并且有一些简短而优雅的东西。@tobias_k如果我不想使用csv并创建自己的逻辑,它错了吗?它会给出与预期的OP相同的结果输出
for d in self.translations:
    key, *langs = d.values()
    # do stuff with key and langs
>>> {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!')])}