我需要从以下内容创建一个新词典:
{'FOO': "('BAR','BAA'),('CAR','CAA')", 'FOOO': "('BAAR','BAAA'),('CAAR','CAAA')"}
我想在字典值中检索元组字符串中的项目,并使用原始密钥和检索到的项目作为对应值创建新字典。检索的项目必须通过放置(每个元组的第一项)。完成的字典应如下所示:
{'FOO': ('BAR','CAR'), 'FOOO': ('BAAR','CAAR')
这应该相对容易,但我一直在试着让我的头发工作。
答案 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数组,pickle
d或marshal
led 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])