2

他のpythonプログラムによって作成されたいくつかのリストを次の形式で出力するpythonプログラムがあります。 [0, [], 0, 1, [], 1]

そして、0と1を文字に変更したいと思います。つまり、上記の入力で、 [x, [], x, y, [], y]出力として持ちたいです

これまでのところ、これを行うコードは次のようになります。

for x in search.Search(s, s.run()):
    if x == 0:
        return x
    elif x == 1
        return y

私は何かが欠けていることを知っていますが、何がよくわかりません:(

4

6 に答える 6

4

リスト内包表記を使用します。

subst = {0: 'x', 1: 'y'}
return [subst.get(v, v) if v else v for v in search.Search(s, s.run()]

使用returnすることで、ループを早期に終了します。

if v else vは、空のリストをキーとして使用しようとするのを避けるのに役立ちます (TypeError が発生します。リストはハッシュ可能ではないため、キーとして使用できません)。代替戦略は次のとおりです。

from collections import Hashable

subst = {0: 'x', 1: 'y'}
hashable = lambda v: isinstance(v, Hashable)
return [subst.get(v, v) if hashable(v) else v for v in search.Search(s, s.run()]

マップのsubst拡張は少し簡単です。ただし、関数を使用して値をマップすると(Jacobの回答で使用されているように)、読みやすくなります。

于 2012-12-21T12:09:40.923 に答える
3

Return は実行を中断します。おそらく、このようなものが必要です

def switch_letter(x):
    if x == 0:
        return 'x'
    if x == 1:
        return 'y'
    return x

my_letters = [switch_letter(x) for x in search.Search(s, s.run())] 
于 2012-12-21T12:10:15.750 に答える
1

この答えはMartjinの答えに似ています。たぶんあなたはこれを試すことができます。ただし、Python>2.4では機能します

>>> a=[0, [], 0, 1, [], 1]
>>> s={0:'x',1:'y'}
>>> [x if isinstance(x,list) else s.get(x,'') for x in a]
['x', [], 'x', 'y', [], 'y']
于 2012-12-21T14:11:57.957 に答える
0

組み込みの関数マップは、リストの圧縮よりも、Python以外のプログラマーにとって、冗長性が低く、理解しやすいと思います。

def sust(item):
    if item == 0:
        return "x"
    if item == 1:
        return "y"
    return item
output = map(sust, search.Search(s, s.run()))
于 2012-12-25T06:04:11.497 に答える
0
    python 3.2
     a= [0, [], 0, 1, [], 1]
     b={0:"x",1:"y"}
     result=[b[i] if isinstance(i,int) else [] for i in a]


  2. [i  if isinstance(i,list) else b[i] for i in a ]
于 2012-12-25T05:45:47.897 に答える
-2

ジェネレーターは内部で if-else ステートメントを許可します。この場合、コードは次のようになります。

['y' if i else 'x' for i in search.Search(s, s.run()]
于 2012-12-21T12:18:13.153 に答える