Python元组列表,需要解包和清理

Python元组列表,需要解包和清理,python,python-2.7,Python,Python 2.7,假设您有一个列表,例如 x=[('Edgar',),('Robert',)] 只有字符串'Edgar'和'Robert'最有效的方法是什么 例如,我并不真正想要x[0][0]。这对于一个: >>> from operator import itemgetter >>> y = map(itemgetter(0), x) >>> y ['Edgar', 'Robert'] >>> y[0] 'Edgar' >>&g

假设您有一个列表,例如

x=[('Edgar',),('Robert',)]

只有字符串
'Edgar'
'Robert'
最有效的方法是什么


例如,我并不真正想要x[0][0]。

这对于一个:

>>> from operator import itemgetter
>>> y = map(itemgetter(0), x)
>>> y
['Edgar', 'Robert']
>>> y[0]
'Edgar'
>>> y[1]
'Robert'
这与
list(itertools.chain.from_iterable(x))
的作用相同,在行为上等同于以下代码:

y = []
for t in x:
    for s in t:
        y.append(s)

简单的解决方案,在大多数情况下速度最快

[item[0] for item in x]
#or
[item for (item,) in x]
或者,如果您需要一个功能接口来索引访问(但速度稍慢):

最后,如果序列太小,无法放入内存,则可以迭代执行此操作。这在集合上要慢得多,但只使用一个项目的内存

from itertools import chain

x = [('Edgar',), ('Robert',)]

# list is to materialize the entire sequence.
# Normally you would use this in a for loop with no `list()` call.
print list(chain.from_iterable(x))
但如果您要做的只是迭代,也可以使用元组解包:

for (item,) in x:
    myfunc(item)

我需要将此字符串发送到另一个函数

如果您的目的只是为列表中的每个字符串调用一个函数,那么就不需要构建一个新的列表,只需

def my_function(s):
    # do the thing with 's'

x = [('Edgar',), ('Robert',)]

for (item,) in x:
    my_function(item)
…或者,如果您准备为了性能而牺牲可读性,我认为这是最快的做法

def my_function(t):
    s = t[0]        
    # do the thing with 's'
    return None

x = [('Edgar',), ('Robert',)]
filter(my_function, x)    
map()
filter()
都将在C中进行迭代,而不是用Python字节码,但是
map()
将需要构建一个与输入列表长度相同的值列表,而
filter()
只会构建一个空列表,只要
myu函数()
返回一个“falsish”值。

这里有一种方法:

>>> [name for name, in x]
['Edgar', 'Robert']

请注意逗号的位置,它将解压元组。

最有效的方法取决于您以后打算如何处理它们。例如,如果您只是在之后迭代列表,那么构建一个新列表是没有意义的。如果是这样的话,更有效的方法是:在x中为(i,)执行以下操作:
:使用(i)
执行某些操作。我需要将此字符串发送到另一个函数。谢谢,一位哲学本科生非常感谢。你为什么说
itemgetter
版本更快?因为我疯了。我认为它以前速度更快,但只是在CPython2.7上测试过,现在不是了。修正答案。
def my_function(t):
    s = t[0]        
    # do the thing with 's'
    return None

x = [('Edgar',), ('Robert',)]
filter(my_function, x)    
>>> [name for name, in x]
['Edgar', 'Robert']