2011-05-07 24 views

Trả lời

7
list = ['a', 'b', 'c', 'd', 'e'] 
result = [] 
for e in list: 
    result.append(e) 
    result.append('-') 
result.pop() 

dường như làm việc

15
>>> list('-'.join(ls)) 
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e'] 
>>> 
+19

Lưu ý rằng tác phẩm chỉ này nếu tất cả các mặt hàng và các seperator là chuỗi ký tự duy nhất! – delnan

6

này nên làm việc với bất kỳ yếu tố danh sách:

>>> sep = '-' 
>>> ls = [1, 2, 13, 14] 
>>> sum([[i, '-'] for i in ls], [])[:-1] 
[1, '-', 2, '-', 13, '-', 14] 
+0

Tốt hơn, và tôi thấy tốt nhất: '' tổng in ((['-', i] cho i trong ls), ls [0: 1]) '' – eyquem

+1

Danh sách tổng là O (n²); nó hiếm khi là một ý tưởng hay. – Veedrac

1

Tôi nghĩ rằng đây là một chút thanh lịch hơn/pythonic cũng như là nói chung. Bạn có thể tìm thấy nó dễ đọc hơn nếu bạn không sử dụng đến một phong cách chức năng mặc dù:

li = ['a','b','c','d','e'] 

from operator import add 
reduce(add, [(elt, "-") for elt in li])[:-1] 

Nếu bạn thích, bạn có thể sử dụng lambda a, b: a + b thay vì operator.add.

+0

Tháp Tôi có ý tưởng tương tự nhưng với ** li [0: 1] ** khi bắt đầu: '' reduce (concat, [['-', x] cho x trong li [1:]], li [0: 1]) '' Upvoted – eyquem

+1

Đây là O (n²); một giải pháp O (n) có thể dễ dàng thực hiện được. – Veedrac

16

Đây là giải pháp mà tôi mong đợi rất nhanh - Tôi tin rằng tất cả các hoạt động này sẽ xảy ra ở tốc độ tối ưu hóa c.

def intersperse(lst, item): 
    result = [item] * (len(lst) * 2 - 1) 
    result[0::2] = lst 
    return result 

Tested:

>>> l = [1, 2, 3, 4, 5] 
>>> intersperse(l, '-') 
[1, '-', 2, '-', 3, '-', 4, '-', 5] 
+0

Điều này có thể là một cách sạch hơn cho bài tập đầu tiên: 'result = [None, item] * len (lst)' – pabouk

+0

@pabouk, có thể làm việc, mặc dù bạn phải gọi 'pop' ở cuối (để lấy màu đỏ của 'mục' bổ sung). Tôi sẽ kiểm tra nó khi tôi có cơ hội để xem nó có nhanh hơn không. – senderle

1

Thích ứng this answer to a similar question:

>>> input = ['a', 'b', 'c', 'd', 'e'] 
>>> sep = ['-'] * len(input) 
>>> list(sum(zip(input, sep),())[:-1]) 
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e'] 

Another answer to the same question thực hiện điều này bằng itertools và một danh sách tách chút thay đổi:

>>> import itertools 
>>> sep = ['-'] * (len(input) - 1) 
>>> list(it.next() for it in itertools.cycle((iter(input), iter(sep)))) 
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e'] 
1

Sau đây sẽ bổ sung thêm một yếu tố "tách" giữa mỗi người trong số những người trong danh sách:

seq = ['a','b','c','d','e'] 

def tween(seq, sep): 
    return reduce(lambda r,v: r+[sep,v], seq[1:], seq[:1]) 

print tween(seq, '-') 

đầu ra:

['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e'] 

FWIW, đây là một chủ đề tương tự mang tên Custom string joining trong Usenet comp.lang.python nhóm mà có thể quan tâm bạn.

2
li = ['a','b','c','d','e'] 
for i in xrange(len(li)-1,0,-1): 
    li[i:i] = '-' 

hoặc

from operator import concat 
seq = ['a','b','c','d','e'] 
print reduce(concat,[['-',x] for x in seq[1:]],seq[0:1]) 

hoặc

li = ['a','b','c','d','e'] 
newli = li[0:1] 
[ newli.extend(('-',x)) for x in li[1:]] 
Các vấn đề liên quan