2

我需要从以下内容创建一个新字典:

{'FOO': "('BAR','BAA'),('CAR','CAA')", 'FOOO': "('BAAR','BAAA'),('CAAR','CAAA')"}

我想在字典值的元组字符串中检索项目,并使用原始键和检索到的项目作为对应值创建一个新字典。检索的项目必须按位置(每个元组的第一项)。完成的字典应如下所示:

{'FOO': ('BAR','CAR'), 'FOOO': ('BAAR','CAAR')

这应该相对容易,但我一直在努力完成这项工作。

4

3 回答 3

3

您可以使用ast.literal_eval来解析这些字符串。然后只需提取正确的元素即可。

d = {'FOO': "('BAR','BAA'),('CAR','CAA')", 'FOOO': "('BAAR','BAAA'),('CAAR','CAAA')"}
d2 = {k: zip(*ast.literal_eval(v))[0] for k,v in d.iteritems()}
# d2 is now {'FOO': ('BAR', 'CAR'), 'FOOO': ('BAAR', 'CAAR')}
于 2013-01-31T22:31:07.597 回答
2

首先,ast.literal_eval将每个"('BAR','BAA'),('CAR','CAA')"变成(('BAR', 'BAA'), ('CAR', 'CAA')).

然后你可以做得到[0]第一个。这就是你所缺少的吗?

值得注意的是,作为一般规则,如果您使用literal_eval,您通常会做错事。例如tuple,您可以存储 JSON 数组或pickledmarshalled tuple ,而不是存储 a 的字符串文字版本。

于 2013-01-31T22:31:27.840 回答
1

这可能不是最好的方法,但您可以使用正则表达式解决它。

import re

di={'FOO': "('BAR','BAA'),('CAR','CAA')",
      'FOOO': "('BAAR','BAAA'),('CAAR','CAAA')"}

ndi = {}
for k in di:
    ndi[k] = re.findall('\(\'(\w+)\'\,', di[k])
于 2013-01-31T22:39:37.987 回答