Python列表及其分割

4
例如,我有以下代码:
a = ["a;b", "c;d",...,"y;z"]

我想将每个列表元素分成相同列表的两个项目。所以我想要得到这样的东西:

["a", "b", "c", "d", ...., "y", "z"]

我该如何做这样的事情?感谢您的答案。
9个回答

9

仅使用字符串操作似乎是最简单的(当然这是主观的),并且速度最快(与迄今为止发布的其他解决方案相比,速度差距巨大)。

>>> a = ["a;b", "c;d", "y;z"]
>>> ";".join(a).split(";")
['a', 'b', 'c', 'd', 'y', 'z']

证明/基准测试

按照经过时间的升序排序:

python -mtimeit -s'a=["a;b","x;y","p;q"]*99' '";".join(a).split(";")'
10000 loops, best of 3: 48.2 usec per loop

python -mtimeit -s'a=["a;b","x;y","p;q"]*99' '[single for pair in a for single in pair.split(";")]'
1000 loops, best of 3: 347 usec per loop

python -mtimeit -s'from itertools import chain; a=["a;b","x;y","p;q"]*99' 'list(chain(*(s.split(";") for s in a)))'
1000 loops, best of 3: 350 usec per loop

python -mtimeit -s'a=["a;b","x;y","p;q"]*99' 'sum([x.split(";") for x in a],[])'
1000 loops, best of 3: 1.13 msec per loop

python -mtimeit -s'a=["a;b","x;y","p;q"]*99' 'sum(map(lambda x: x.split(";"), a), [])'
1000 loops, best of 3: 1.22 msec per loop

python -mtimeit -s'a=["a;b","x;y","p;q"]*99' 'reduce(lambda x,y:x+y, [pair.split(";") for pair in a])'
1000 loops, best of 3: 1.24 msec per loop

应该有一种——最好只有一种——明显的方法来完成它。哦,好吧。 - JasonFruit

5
你可以使用 itertools.chain:
>>> a = ["a;b", "c;d","y;z"]
>>> list(itertools.chain(*(s.split(';') for s in a)))
['a', 'b', 'c', 'd', 'y', 'z']

太棒了!一行解决方案)itertools但是如此优雅! - alexvassel

3

更加功能化的方法:

>>> l = ["a;b", "c;d", "e;f", "y;z"]
>>> sum(map(lambda x: x.split(';'), l), [])
['a', 'b', 'c', 'd', 'e', 'f', 'y', 'z']

1
使用 sum 来展开列表并不是邪恶的,但相当违反直觉。 - user395760
我认为这只是个人口味问题。它绝对比 [ y for z in [ x.split(';') for x in a ] for y in z ] 更易读,顺便说一下,后者是最高效的解决方案。 - Michal Chruszcz
我认为这相当直观和易读;我可以看出是以这种方式完成的。 - JasonFruit
@delnan: 为什么?期望的输出列表确实是[] + ['a', 'b'] + ['c', 'd'] + ['e', 'f'] + ['y', 'z'],因此它那些列表的总和(这就是代码的作用)。 - ShreevatsaR
@ShreevatsaR:不,这不是求和。首先,求和是可交换的。它们是那些连接在一起的列表,这是一种独特的操作,尽管连接操作符也用于求和。 - user395760

1

这个可以工作:

l = []
for item in ["a;b", "c;d", "e;f"]:
     l += item.split(";")

print l

它给出:

['a', 'b', 'c', 'd', 'e', 'f']

1
a = ["a;b", "c;d","y;z"]
print [atom for pair in a for atom in pair.split(';')]

提供您所需的内容:

['a', 'b', 'c', 'd', 'y', 'z']

注意:我无法告诉你如何在数组中从“...”到“....”


确实不需要使用itertools来处理这样简单的情况。 - Eric O. Lebigot

0

0
a = ["a;b", "c;d","e;f","y;z"]
b = []
for i in a:
    c = i.split(';')
    b = b + c

print b

0
比 Felix Kling 的回答稍微长一点,但是这里有。首先将列表分成子列表。
>>> a_split = [i.split(";", 1) for i in a]

这将导致一个形如列表的结果:
[[a,b], [c,d], ..., [y,z]]

现在你需要以某种方式“合并”内部和外部列表。内置的reduce()函数非常适合这个任务:

>>> reduce(lambda x, y: x + y, a_split)

看这里:

['a', 'b', 'c', 'd', ... 'y', 'z']

0

可以使用字符串来实现这个功能:

>>> a = ["a;b", "c;d","y;z"]
>>> list(''.join(a).replace(';', ''))
['a', 'b', 'c', 'd', 'y', 'z']

这个解决方案是目前为止建议的最快速的之一:

# Shawn Chin's solution (the fastest so far, by far):
python -mtimeit -s'a=["a;b","x;y","p;q"]*99' '";".join(a).split(";")'
10000 loops, best of 3: 27.4 usec per loop

# This solution:
python -mtimeit -s'a=["a;b","x;y","p;q"]*99' "list(''.join(a).replace(';', ''))"
10000 loops, best of 3: 33.5 usec per loop

结论是,在这种情况下,由字符串表示的列表可能非常高效,可能是因为内存处理更简单(字符存储在连续的内存位置中)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接