过滤包含元组字符串的Python字典值中的项目

时间:2013-01-31 22:27:44

标签: python dictionary

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

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

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

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

这应该相对容易,但我一直在试着让我的头发工作。

3 个答案:

答案 0 :(得分: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')}

答案 1 :(得分:2)

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

然后你可以[0]来获得第一个。这就是你失踪的一切吗?

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

答案 2 :(得分: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])