2012-05-03 38 views
9

Tôi đang viết một kịch bản nhỏ để trợ giúp với ghi nhớ kana của Nhật Bản. Làm cách nào để kết hợp các danh sách sau vào một danh sách? Tôi đã thử như sau.Kết hợp các danh sách vào một

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

Cảm ơn, tôi đã thực hiện tìm kiếm đó, nhưng không thể tìm thấy bất cứ điều gì hữu ích. Những câu trả lời này đều hữu ích, cảm ơn tất cả mọi người! :) – abkai

Trả lời

14

Một cách:

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

Sử dụng 'sum()' với các danh sách có hiệu suất bậc hai. Nó sẽ tạo một danh sách hoàn toàn mới mỗi khi nó thêm một danh sách khác –

+0

Trường hợp đó cũng không phải là trường hợp của toán tử '+'? – spinlok

+1

@spinlok yes, '+' và 'sum' tương đương xấu cho việc này. Cách tốt nhất là sử dụng 'itertools.chain', cho mỗi @JackKelly và @gnibbler, không xây dựng bất kỳ danh sách trung gian nào. – lvc

11

Câu hỏi đặt ra là có hiệu quả hỏi làm thế nào để bạn làm phẳng mà danh sách liệt kê, được trả lời ở đây: join list of lists in python.

Bạn có thể in ra tất cả mọi thứ bằng cách thực hiện một cái gì đó như:

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

hoặc 'chuỗi.from_iterable (kana) ' –

+2

Theo ý kiến ​​của tôi, giải pháp itertools chắc chắn phù hợp với những người được sử dụng để lặp đi lặp lại và sử dụng mô đun ở mã khác. Nếu không, nó ít tự giải thích hơn so với sử dụng các phương pháp của các loại cơ bản. Nó cũng chậm hơn - xem thời gian trong câu trả lời của tôi. – pepr

1

Sau đây là một sự hiểu biết danh sách với so_on được sử dụng như một cắt ngắn chỉ trong ví dụ này để đại diện cho danh sách còn lại thực tế mà bạn muốn phối hợp.

Các chặng đường dài:

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

Sử dụng một danh sách hiểu cho một tác dụng phụ thường được coi là unpythonic –

+0

@gnibbler bạn nói đúng, nhưng tôi chỉ sử dụng nó ở đây vì việc hiểu danh sách rất nhanh. –

+0

Thật sao? Bạn có thời gian LC so với vòng lặp 'for' không? –

7

My 1 cho rõ ràng vòng lặp for với .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. 
... 

Khi đo, đồng bằng vòng lặp for là nhanh hơn so với dụng phụ có hiệu lực bằng cách hiểu danh sách.

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 

It in trên giao diện điều khiển của tôi:

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

Dù sao, thời gian là dành cho lặp đi lặp lại cùng 100 ngàn lần. Số lượt đọc có thể đọc được là đối số của tôi.

1

Người ta cũng cần phải nhận thức thực tế, một điều rất quan trọng, rằng danh sách phẳng cổ phiếu các đối tượng gốc với danh sách ban đầu của danh sách. Đây không phải là một vấn đề trong trường hợp này, vì các đối tượng là các chuỗi bất biến. Nếu các đối tượng có thể thay đổi, việc thay đổi chúng trong một cấu trúc sẽ thay đổi giá trị phần tử quan sát được thông qua cấu trúc thứ hai.

Để tóm tắt, người ta phải biết thêm một chút về nội bộ Python. Đôi khi chúng ta muốn tạo một bản sao của các danh sách con ban đầu, như thế:

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

cách khác với lambda

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

reduce(lambda x,y: x+y,kana) 
Các vấn đề liên quan