2017-11-23 8 views
1
airports = [['BCN','Barcenlona'],['DUB','Dublin']] 

code = raw_input().upper() 

for i in airports: 
    if i[0] == code: 
     print i[1] 

私は、次の使用して2次元配列をループすることができました:、しかしリスト内包にループする変換

[i[0] for i in airports for i[0] in i] 

ことが可能ですリストの内包によってを使用して、同じ効果を達成するために例えばユーザのコードBCNはBarcenlonaを出力しますか?

+4

A辞書ですが、このシナリオでは、より適切なものとわかりました、ああ@thatrockbottomprogrammer – thatrockbottomprogrammer

+0

ずっと速いだろう - 私はこの作業の目的のために残念なことにリスト形式で2D配列を使用する必要があります。 – LearningToPython

答えて

3

辞書は、やり方はです。

In [332]: airports = [['BCN','Barcenlona'],['DUB','Dublin']] 

In [333]: dict(airports) 
Out[333]: {'BCN': 'Barcenlona', 'DUB': 'Dublin'} 

In [334]: mapping = dict(airports) 

In [335]: mapping.get('DUB') 
Out[335]: 'Dublin' 

辞書に配列を変換し、そして(KeyError Sをスローしません)[]、またはdict.getと辞書のインデックスのいずれかを使用します。

辞書の利点は、それがイディオム的にデータに適していることと、繰り返し検索がデータのユースケースである場合に理想的な値の時間ルックアップO(1)を容易にすることです。


あなたは2次元配列を使用する必要がある場合は、あなたがしようとnextを使用して可能な限り、これはのように効率的に行うことができます -

  1. 発電理解

    next((y for x, y in airports if x == code), 'Not Found') 
    

    nextは2つの引数を受け入れることができます(任意のイテレータ)

  2. イテレータが何も返さない場合に返されるデフォルトの引数

ここでは、迅速なサンプルです:あなたはO(N)複雑さを免れることはできないことに注意してください

In [338]: next(y for x, y in airports if x == 'XXX') 
--------------------------------------------------------------------------- 
StopIteration        Traceback (most recent call last) 

:デフォルト引数がない

In [336]: next((y for x, y in airports if x == 'DUB'), 'Not Found') 
Out[336]: 'Dublin' 

In [337]: next((y for x, y in airports if x == 'XXX'), 'Not Found') 
Out[337]: 'Not Found' 

nextは無効なキーとStopIterationをスローします辞書なしの落とし穴。

1

@ thatrockbottomprogrammerのコメントに記載されているように、辞書が優れています。しかし、あなたはまだリストの内包表記を使用したい場合は、あなたがこれを行うことができます:

airports = [['BCN','Barcenlona'],['DUB','Dublin']] 

code_request = raw_input().upper() 

# for i in airports: 
#  if i[0] == code: 
#   print i[1] 

results = [city for (code, city) in airports if code == code_request]