2

2 つのリストがあります。1つ目は次のa_listとおりです。

a_list = [1,2,3]

2 つ目はb_listで、リストを含むリストです。こんな感じです:

b_list = [['a',1,'b'],['c',2,'g'],['e',3,'5']

私がやろうとしているのはa_list、正しいを見つけてb_listに印刷するために使用することvalue[2]ですb_list

私のコードは次のようになります:

for a in a_list:
    for b in b_list:
        if b[1] == a:
            print b[2]

実際にa_listは 136 個の値があります。リアルb_listには 315 個のリストがあります。

b_list最初に b 項目にインデックスを付けてifから削除するコードを書きましたb[1] == a

実際の問題を解決するために、そのコードを取り出しました。

4

2 に答える 2

5

ループする必要はありませんa_list。簡単なinテストで十分です。

for b in b_list:
    if b[1] in a_list:
        print b[2]

a_listセットを作成すると、パフォーマンスが向上します。

a_set = set(a_list)

for b in b_list:
    if b[1] in a_set:
        print b[2]

いずれにせよ、このコードは以下を出力します。

b
g
5

あなたのサンプルデータのために。

于 2013-03-05T21:51:04.500 に答える
0

あなたが何をしたいのかを正しく理解していれば:

a_list = [1,2,3,5]

b_list = [['a',1,'b'],['c',2,'g'],['e',3,'5'],
          ['d',4,'h'],['Z',5,'X'],['m',6,'i']]

print 'a_list ==',a_list
print '\nb_list before :\n',b_list

print '\nEnumerating b_list in reversed order :'
L = len(b_list)
print ('  i       el          L-i  b_list[L-i]  \n'
       '  -------------------------------------')
for i,el in enumerate(b_list[::-1],1):
    print '  %d  %r     %d  %r' % (i,el,L-i,b_list[L-i])


L = len(b_list)
for i,el in enumerate(b_list[::-1],1):
    if el[1] in a_list:
        del b_list[L-i]


print  '\nb_list after :\n',b_list

結果

a_list == [1, 2, 3, 5]

b_list before :
[['a', 1, 'b'], ['c', 2, 'g'], ['e', 3, '5'],
 ['d', 4, 'h'], ['Z', 5, 'X'], ['m', 6, 'i']]

Enumerating b_list in reversed order :
  i       el          L-i  b_list[L-i]  
  -------------------------------------
  1  ['m', 6, 'i']     5  ['m', 6, 'i']
  2  ['Z', 5, 'X']     4  ['Z', 5, 'X']
  3  ['d', 4, 'h']     3  ['d', 4, 'h']
  4  ['e', 3, '5']     2  ['e', 3, '5']
  5  ['c', 2, 'g']     1  ['c', 2, 'g']
  6  ['a', 1, 'b']     0  ['a', 1, 'b']

b_list after :
[['d', 4, 'h'], ['m', 6, 'i']]

逆の順序で b_list を反復する必要がある理由は、 abarnertによって言われ、ドキュメントによって以下に説明されているものです:

注: シーケンスがループによって変更されている場合、微妙な点があります (これは変更可能なシーケンス、つまりリストの場合にのみ発生します)。内部カウンターは、次に使用されるアイテムを追跡するために使用され、反復ごとにインクリメントされます。このカウンターがシーケンスの長さに達すると、ループは終了します。これは、スイートが現在の (または前の) アイテムをシーケンスから削除する場合、次のアイテムはスキップされることを意味します (既に処理された現在のアイテムのインデックスを取得するため)。同様に、スイートがシーケンス内の現在のアイテムの前にアイテムを挿入すると、現在のアイテムは次回のループで再び処理されます。これは、シーケンス全体のスライスを使用して一時的なコピーを作成することで回避できる厄介なバグにつながる可能性があります。

for x in a[:]:
if x < 0: a.remove(x)

http://docs.python.org/2/reference/compound_stmts.html#the-for-statement

于 2013-03-05T22:09:43.310 に答える