1

好奇心から、次のロジックを優れた辞書内包として書くことは可能ですか?

a = "a c\nb c\nn q\n".split('\n')[:-1]

output = {}
for line in a:
    tmp = line.split(' ')
    output[tmp[0]] = tmp[1]

私は次のように書きましたが、一時的な割り当てがなければ、残念ながら 2 回分割する必要があります。

{line.split(' ')[0]:line.split(' ')[1] for line in a}

もっとエレガントなものはありますか?

4

7 に答える 7

6

この場合、dictコンストラクターは 2 シーケンスの iterable を使用するため、少し優れていると思います。

dict(line.split() for line in a)

デモ:

>>> a
['a c', 'b c', 'n q']
>>> dict(line.split() for line in a)
{'a': 'c', 'b': 'c', 'n': 'q'}
于 2014-07-29T13:50:52.293 に答える
4

ネストされたリスト内包表記を使用します。

{p[0]:p[1] for p in [l.split(" ") for l in a]}

出力:

{'a': 'c', 'b': 'c', 'n': 'q'}
于 2014-07-29T13:40:09.397 に答える
2

特定の入力の空白に非常に固有:

>>> a = "a c\nb c\nn q\n".split('\n')[:-1]
>>> {line[0]:line[2] for line in a}
{'a': 'c', 'b': 'c', 'n': 'q'}
于 2014-07-29T13:48:26.957 に答える
0

この場合、使用できます

dict(line.split(' ') for line in a)

しかし、より複雑な「値処理」については、通常、「通常の」ループを使用するか(あなたが行ったように)、小さなヘルパー関数を作成する方が簡単だと思います:

def helper(val):
    ...
    return key, value

dict(helper(line) for line in a)

これは、私がPythonについて本当に嫌いなことの1つです(ラムダ/匿名関数の構文が不自由です) 。

于 2014-07-29T13:53:15.700 に答える
0

それは動作しますか:

>>> a = "a c\nb c\nn q\n".split('\n')[:-1]

>>> {i[0]:i[1]  for line in a for i in [line.split(' ')]}
 {'a': 'c', 'b': 'c', 'n': 'q'}
于 2014-07-29T13:42:59.210 に答える
0

分割なしでネストされたリスト内包表記を使用します。

>>> {line[0]:line[-1] for line in a}
{'a': 'c', 'b': 'c', 'n': 'q'}
于 2014-07-29T13:56:12.830 に答える