3

假设您有一个列表,例如

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

获取字符串'Edgar'和的最有效方法是'Robert'什么?

例如,真的不想要 x[0][0]。

4

5 回答 5

6

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

[item[0] for item in x]
#or
[item for (item,) in x]

或者,如果您需要一个功能接口来索引访问(但速度稍慢):

from operator import itemgetter

zero_index = itemgetter(0)

print map(zero_index, 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)
于 2013-04-30T16:14:27.547 回答
3

这对于列表理解非常简单:

x = [('Edgar',), ('Robert',)]
y = [s for t in x for s in t]

这与以下代码执行相同的操作list(itertools.chain.from_iterable(x))并且在行为上等效:

y = []
for t in x:
    for s in t:
        y.append(s)
于 2013-04-30T16:13:50.547 回答
2

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

如果您的意图只是为列表中的每个字符串调用一个函数,则无需构建新列表,只需...

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()只会构建一个空列表,只要my_function()返回一个“假”值。

于 2013-04-30T16:18:30.533 回答
2

这是一种方法:

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

注意逗号的位置,它会解包元组。

于 2013-04-30T16:30:39.867 回答
1
>>> from operator import itemgetter
>>> y = map(itemgetter(0), x)
>>> y
['Edgar', 'Robert']
>>> y[0]
'Edgar'
>>> y[1]
'Robert'
于 2013-04-30T16:12:18.390 回答