在python中从元组的元组中获取元素

在python中从元组的元组中获取元素,python,tuples,Python,Tuples,可能重复: 如何通过代码查找国家名称 COUNTRIES = ( ('AF', _(u'Afghanistan')), ('AX', _(u'\xc5land Islands')), ('AL', _(u'Albania')), ('DZ', _(u'Algeria')), ('AS', _(u'American Samoa')), ('AD', _(u'Andorra')), ('AO', _(u'Angola')), ('AI', _(u'A

可能重复:

如何通过代码查找国家名称

COUNTRIES = (
   ('AF', _(u'Afghanistan')),
   ('AX', _(u'\xc5land Islands')),
   ('AL', _(u'Albania')),
   ('DZ', _(u'Algeria')),
   ('AS', _(u'American Samoa')),
   ('AD', _(u'Andorra')),
   ('AO', _(u'Angola')),
   ('AI', _(u'Anguilla'))
)
我有代码
作为
,在
国家
元组上不使用forloop就可以找到它的名称?

你不能

或者

[x[1] for x in COUNTRIES if x[0] == 'AS'][0]

但这些仍然是“循环”。

您可以简单地执行以下操作:

countries_dict = dict(COUNTRIES)  # Conversion to a dictionary mapping
print countries_dict['AS']

这只是在国家缩写和国家名称之间创建映射。访问映射的速度非常快:如果进行多次查找,这可能是最快的方法,因为Python的字典查找非常有效。

我必须使用元组,我知道它在dict中很容易。@Sergey:Django在某些地方使用assoc列表。@Ahsan:在尝试获取密钥之前,您必须将其转换为dict,或者循环直到找到钥匙。没有别的办法了。@Cat Plus:谢谢你的帮助!没有否决票,但这两种解决方案都是低效的:每次查找都会重新读取所有国家/地区,即使在国家/地区列表的开头找到了“AS”国家/地区。您的意思是,如果有多个查找,则效率低下。这些方法实际上总是效率低下:即使在国家/地区列表的开头找到了“AS”国家/地区,列表的其余部分也会被不必要地读取。罗伯特·金的回答显示了做类似事情的有效方法。@EOL:yepp,
(..).next()
会更好。这是许多人已经说过的答案。为什么要重复一遍呢?我并没有在其他例子中看到使用生成器的例子,这很好+1可以通过执行
next(代码所在国家/地区,如果代码=='AD')
,缩短发电机版本。内置的
next(a)->a.next()
。(无可否认,在微基准测试中,内置的
next
将因此表现得更差,但无论如何,这是一个有趣的事实。)实际上有一种方法使用内置的
next
更好:它的
默认
参数。e、 g.
next((对于代码,国家/地区,如果代码=='AD'),则为无)
将返回
None
,如果没有语言匹配。对于高效生成器+1。请注意,如果我没记错的话,
next(…)
是官方推荐的,而不是您的
…next()
。您知道转换+查找是否比通过元组循环查找匹配要快吗?@daramarak:对于单个查找,创建字典应该要慢一些。请看我被否决的答案/@yi_H:提出了一个有趣的观点!但是for循环的时间复杂度是O(n),访问元组/字典的时间复杂度是O(1)。你说的是铸型所花费的时间吗?请指定您的逻辑。@mangobug:创建字典是O(n),您必须分配空间并复制条目。。。为此,您显然必须循环遍历元组。现在,将其与一个简单的循环进行比较,该循环找到了合适的入口点+你的答案也是:)
COUNTRIES = (
   ('AF', (u'Afghanistan')),
   ('AX', (u'\xc5land Islands')),
   ('AL', (u'Albania')),
   ('DZ', (u'Algeria')),
   ('AS', (u'American Samoa')),
   ('AD', (u'Andorra')),
   ('AO', (u'Angola')),
   ('AI', (u'Anguilla'))
)

print (country for (code, country) in COUNTRIES if code=='AD').next()
#>>> Andorra

print next((country for (code, country) in COUNTRIES if code=='AD'), None)
#Andorra
print next((country for (code, country) in COUNTRIES if code=='Blah'), None)
#None

# If you want to do multiple lookups, the best is to make a dict:
d = dict(COUNTRIES)
print d['AD']
#>>> Andorra
COUNTRIES = (
   ('AF', (u'Afghanistan')),
   ('AX', (u'\xc5land Islands')),
   ('AL', (u'Albania')),
   ('DZ', (u'Algeria')),
   ('AS', (u'American Samoa')),
   ('AD', (u'Andorra')),
   ('AO', (u'Angola')),
   ('AI', (u'Anguilla'))
)

print (country for (code, country) in COUNTRIES if code=='AD').next()
#>>> Andorra

print next((country for (code, country) in COUNTRIES if code=='AD'), None)
#Andorra
print next((country for (code, country) in COUNTRIES if code=='Blah'), None)
#None

# If you want to do multiple lookups, the best is to make a dict:
d = dict(COUNTRIES)
print d['AD']
#>>> Andorra