17

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

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
4

8 回答 8

19

单程:

kana = a + k + g + s + z + t + d + n + h + b + p + m + y + n
于 2012-05-03T02:15:24.770 回答
17

这个问题实际上是在问你如何展平列表列表,这里回答:join list of lists in python

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

import itertools
print list(itertools.chain(*kana))
于 2012-05-03T02:25:39.893 回答
8

我对显式for 循环的+1.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.
...

测量时,普通的 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

无论如何,是时候重复同样的 10 万次了。可读性很重要是我的论点。

于 2012-05-03T07:49:53.353 回答
5
kana = sum([a, k, g, s, z, t, d, n, h, b, p, m, y, n], [])
于 2012-05-03T02:25:24.763 回答
2

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

总而言之,必须对 Python 内部结构有更多了解。有时我们想要复制原始子列表,如下所示:

...
result = []
for sublist in lst:
    result.extend(sublist[:])     # notice the [:] here
...
于 2012-05-03T19:38:17.050 回答
1

以下是列表推导so_on式,仅在示例中用作快捷方式来表示您要组合的实际剩余列表。

漫长的道路:

>>> all_list = [e for l in [a, k, so_on] for e in l]
于 2012-05-03T02:28:53.027 回答
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']
于 2012-05-03T02:39:47.487 回答
1

与 lambda 的其他方式

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

reduce(lambda x,y: x+y,kana)
于 2013-01-25T04:14:17.207 回答