Combining lists into one

abk*_*kai 11 python list

I am writing a small script to help out with Japanese kana memorisation. How would I combine the following lists into one? I tried as follows.

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
Run Code Online (Sandbox Code Playgroud)

Mar*_*nen 14

One way:

kana = a + k + g + s + z + t + d + n + h + b + p + m + y + n
Run Code Online (Sandbox Code Playgroud)


Jac*_*lly 14

问题是如何有效地询问如何压缩列表列表,这里回答:在python中加入列表列表.

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

import itertools
print list(itertools.chain(*kana))
Run Code Online (Sandbox Code Playgroud)

  • 或`chain.from_iterable(假名)` (3认同)
  • 在我看来,itertools解决方案绝对适合那些习惯于itertools并且在其他代码中使用该模块的人.否则,它比使用基本类型的方法更不自理.它也慢 - 在我的答案中看到时间. (2认同)

pep*_*epr 7

我对明确+1 for循环.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.
...
Run Code Online (Sandbox Code Playgroud)

测量时,通过列表理解,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
Run Code Online (Sandbox Code Playgroud)

它在我的控制台上打印:

for loop: 0.389831948464
list comprehension side effect: 0.468136159616
itertools: 0.620626692887
Run Code Online (Sandbox Code Playgroud)

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


spi*_*lok 5

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

  • 对列表使用`sum()`具有二次性能.每次添加另一个列表时,它都会创建一个全新的列表 (2认同)