将列表合并为一个

时间:2012-05-03 02:14:12

标签: python list

我正在写一个小脚本来帮助日本假名记忆。我如何将以下列表合并为一个?我尝试如下。

a = ["a",   "i",   "u",   "e",   "o"]
k = ["ka",  "ki",  "ku",  "ke",  "ko"]
g = ["ga",  "gi",  "gu",  "ge",  "go"]
s = ["sa",  "shi", "su",  "se",  "so"]
z = ["za",  "ji",  "zu",  "ze",  "zo"]
t = ["ta",  "chi", "tsu", "te",  "to"]
d = ["da",         "du",  "de",  "do"]
n = ["na",  "ni",  "nu",  "ne",  "no"]
h = ["ha",  "hi",  "hu",  "he",  "ho"]
b = ["ba",  "bi",  "bu",  "be",  "bo"]
p = ["pa",  "pi",  "pu",  "pe",  "po"]
m = ["ma",  "mi",  "mu",  "me",  "mo"]
y = ["ya",         "yu",         "yo"]
n = ["n"]

kana = [a, k, g, s, z, t, d, n, h, b, p, m, y, n]

print kana

8 个答案:

答案 0 :(得分:14)

问题是如何有效地询问如何压缩列表列表,在此处回答:join list of lists in python

您可以通过执行以下操作打印出所有内容:

import itertools
print list(itertools.chain(*kana))

答案 1 :(得分:13)

一种方式:

kana = a + k + g + s + z + t + d + n + h + b + p + m + y + n

答案 2 :(得分:7)

我的+1代表显式 for loop .extend()

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...
Readability counts.
...
In the face of ambiguity, refuse the temptation to guess.
...

测量时,通过列表理解,plain for循环比副作用更快。

import itertools
import timeit

def flattenListOfLists(lst):
    result = []
    for sublist in lst:
        result.extend(sublist)
    return result

def flattenListOfLists2(lst):
    result = []
    [result.extend(sublist) for sublist in lst]  # uggly side effect ;)
    return result

def flattenIterTools(lst):
    return list(itertools.chain(*lst))


a = ["a",   "i",   "u",   "e",   "o"]
k = ["ka",  "ki",  "ku",  "ke",  "ko"]
g = ["ga",  "gi",  "gu",  "ge",  "go"]
s = ["sa",  "shi", "su",  "se",  "so"]
z = ["za",  "ji",  "zu",  "ze",  "zo"]
t = ["ta",  "chi", "tsu", "te",  "to"]
d = ["da",         "du",  "de",  "do"]
n = ["na",  "ni",  "nu",  "ne",  "no"]
h = ["ha",  "hi",  "hu",  "he",  "ho"]
b = ["ba",  "bi",  "bu",  "be",  "bo"]
p = ["pa",  "pi",  "pu",  "pe",  "po"]
m = ["ma",  "mi",  "mu",  "me",  "mo"]
y = ["ya",         "yu",         "yo"]
n = ["n"]

kana = [a, k, g, s, z, t, d, n, h, b, p, m, y, n]

t = timeit.timeit('lst = flattenListOfLists(kana)', 'from __main__ import kana, flattenListOfLists', number=100000)
print 'for loop:', t

t = timeit.timeit('lst = flattenListOfLists2(kana)', 'from __main__ import kana, flattenListOfLists2', number=100000)
print 'list comprehension side effect:', t

t = timeit.timeit('lst = flattenIterTools(kana)', 'from __main__ import kana, flattenIterTools\nimport itertools', number=100000)
print 'itertools:', t

它在我的控制台上打印:

for loop: 0.389831948464
list comprehension side effect: 0.468136159616
itertools: 0.620626692887

无论如何,时间是重复相同的100万次。 可读性计数是我的论点。

答案 3 :(得分:5)

kana = sum([a, k, g, s, z, t, d, n, h, b, p, m, y, n], [])

答案 4 :(得分:1)

以下是一个列表理解,其中so_on被用作示例中的快捷方式,用于表示要组合的实际剩余列表。

漫长的道路:

>>> `all_list = [e for l in [a, k, so_on] for e in l]`

答案 5 :(得分:1)

kana = [a, k, g, s, z, t, d, n, h, b, p, m, y, n]
combined_list=[]
for x in kana:
    combined_list.extend(x) 
print(combined_list)

['a', 'i', 'u', 'e', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'ga', 'gi', 'gu', 'ge', 'go', 'sa', 'shi', 'su', 'se', 'so', 'za', 'ji', 'zu', 'ze', 'zo', 'ta', 'chi', 'tsu', 'te', 'to', 'da', 'du', 'de', 'do', 'n', 'ha', 'hi', 'hu', 'he', 'ho', 'ba', 'bi', 'bu', 'be', 'bo', 'pa', 'pi', 'pu', 'pe', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'n']

答案 6 :(得分:1)

还应该注意一个非常重要的事实,即展平列表与原始列表列表共享原始对象。在这种情况下,这不是问题,因为对象是不可变的字符串。如果对象是可变的,在一个结构中更改它们将改变通过第二个结构可观察的元素值。

总结一下,人们必须更多地了解Python内部。有时我们想制作原始子列表的副本,如:

...
result = []
for sublist in lst:
    result.extend(sublist[:])     # notice the [:] here
...

答案 7 :(得分:1)

使用lambda的其他方式

kana = [a, k, g, s, z, t, d, n, h, b, p, m, y, n]

reduce(lambda x,y: x+y,kana)