2012-05-03 58 views
9

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

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 
+0

谢谢,我也进行了一个搜索,但没有找到什么有用的东西。这些答案都很有帮助,谢谢大家! :) – abkai

回答

14

方式一:

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

http://ideone.com/M9WbM – dwerner

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

在列表中使用'sum()'具有二次性能。它会在每次添加另一个列表时创建一个全新列表 –

+0

与“+”运算符的情况不一样吗? – spinlok

+1

@spinlok是的,'+'和'sum'对于这个是等价的。最好的方法是使用'itertools.chain',per @JackKelly和@gnibbler,它不构建任何中间列表。 – lvc

11

的问题是有效地问你怎么扁平名单该名单,这是在这里找到答案:join list of lists in python

你可以做类似的东西打印出来的一切:

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

或'链。from_iterable(假名)' –

+2

在我看来,迭代工具的解决方案绝对是适合那些谁是用来itertools,谁使用其他代码模块。否则,与使用基本类型的方法相比,它不那么容易理解。它也比较慢 - 请在我的答案中查看时间。 – pepr

1

下面是一个列表理解与so_on被用作短切只是在本例中,以表示你想要的实际剩余名单结合。

很长的路要走:

>>> `all_list = [e for l in [a, k, so_on] for e in l]` 
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'] 
+1

使用列表中理解的副作用被普遍认为unpythonic –

+0

@gnibbler你是对的,但我只是用它在这里,因为列表解析速度快。 –

+0

真的吗?你有没有把LC与'for for循环? –

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. 
... 

当测量,循环平原比副作用快效果通过列表理解。

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万次。 可读性计数是我的论点。

1

你也应该知道一个非常重要的事实,该平面化列表股原始对象用列表的原始列表。这在这种情况下不是问题,因为对象是不可变的字符串。如果对象是可变的,则在一个结构中更改它们会通过第二个结构更改可观察的元素值。

总之,一个必须知道一点关于Python的内部。有时候,我们想使原来的子表的副本,这样的:

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

与拉姆达其他方式

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

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