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いる場合は、通常、何か間違ったことをしていることに注意してください。たとえば、 a の文字列リテラル バージョンを格納する代わりにtuple、JSON 配列、またはpickledまたはmarshalled tupleを格納できます。

于 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 に答える