[英]Python lists and their splitting
例如,我有這樣的代碼
a = ["a;b", "c;d",...,"y;z"]
我想將每個列表元素拆分為同一列表中的項目。 所以我想得到這樣的東西:
["a", "b", "c", "d", ...., "y", "z"]
我該怎么辦? 謝謝你的回答。
僅使用字符串操作似乎是最簡單的 (當然這是主觀的)和最快的 (與迄今為止發布的其他解決方案相比,差距很大)。
>>> 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
你可以使用itertools.chain
:
>>> a = ["a;b", "c;d","y;z"]
>>> list(itertools.chain(*(s.split(';') for s in a)))
['a', 'b', 'c', 'd', 'y', 'z']
更功能的方法:
>>> l = ["a;b", "c;d", "e;f", "y;z"]
>>> sum(map(lambda x: x.split(';'), l), [])
['a', 'b', 'c', 'd', 'e', 'f', 'y', 'z']
這是工作:
l = []
for item in ["a;b", "c;d", "e;f"]:
l += item.split(";")
print l
它給 :
['a', 'b', 'c', 'd', 'e', 'f']
a = ["a;b", "c;d","y;z"]
print [atom for pair in a for atom in pair.split(';')]
給出你想要的東西:
['a', 'b', 'c', 'd', 'y', 'z']
注意:我無法告訴你如何在陣列中間從'...'到'....'
l = []
for current in [c.split(';') for c in a]:
l.extend(current)
您可能想要閱讀列表推導http://docs.python.org/tutorial/datastructures.html#list-comprehensions
a = ["a;b", "c;d","e;f","y;z"]
b = []
for i in a:
c = i.split(';')
b = b + c
print b
比費利克斯克林的回答要長一點,但這里有。 首先將列表拆分為子列表
>>> 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']
字符串可以用於此:
>>> 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
士氣是在這種情況下由字符串表示的列表可能非常有效,可能是因為更簡單的內存處理(字符存儲在連續的內存位置)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.