2012-02-04 66 views
1

是否有人知道將列表列表變成看起來像我在下面繪製的內容的語法?在列表中添加換行符

列出的名單看起來就像這樣:

list = [0, [~, ~, ~], 1, [~, ~, ~], 2, [~, ~, ~] ] 

這是所需的輸出:

0 ~ ~ ~ 
1 ~ ~ ~ 
2 ~ ~ ~ 

我見過其他人只問一個類似的問題,但其子列表有一個元素,並且每個子列表前都沒有整數元素,因此他們使用以下內容來獲得我需要的結果:

"\n".join(item[0] for item in list) 

我不知道如何操縱上面的代碼行來解決我的具體問題。我試圖改變

item[0] to item[0:len(sub_list)] 

和許多其他的事情,但沒有任何工作。 (我對Python的經驗不足)

任何幫助將不勝感激。謝謝。

回答

6

人們總是可以通過三三兩兩使用顯式迭代:

el = [0, ['~', '~', '~'], 1, ['~', '~', '~'], 2, ['~', '~', '~'] ] 
for i in range(0, len(el), 2): 
    print el[i], " ".join(el[i+1]) 

我不能目前想不出什麼聰明。

+0

它的清晰,高效,無誤的;聰明被詛咒。 – 2012-02-04 23:45:58

0

你可以在兩組使用在索引的理解到列表

'\n'.join('%s %s' % (list[2 * i], list[2 * i + 1]) for i in [0:len(list)/2]) 
0

第一的長度,我使用zip()到組列表。然後,我遍歷子列表,並使用join()將其元素與一個空白符合,將它添加到第一個元素,最後將所有行連接到一個分隔符(\n)。

>>> my_list = [0, [11, 1.2, 'str1'], 1, [21, 2.2, 'str2'], 2, [31, 3.2, 'str3'] ] 
>>> it = iter(my_list) 
>>> my_str = '\n'.join((str(x) + ' ' + ' '.join(str(y) for y in l)) for x, l in zip(it, it)) 
>>> print my_str 
0 11 1.2 str1 
1 21 2.2 str2 
2 31 3.2 str3 

此解決方案將與您的列表和子列表中的任何類型的工作。

1

首先,讓我們來糾正定義:

lst = [0, ['~', '~', '~'], 1, ['~', '~', '~'], 2, ['~', '~', '~']] 

請,從來沒有使用list作爲標識符名稱。它會影響內置函數list

爲了更方便處理,將其轉換列表中的一個簡單的列表:

lst = [[lst[i]] + lst[i+1] for i in xrange(0, len(lst), 2)] 

然後join說:

print "\n".join([" ".join(map(str, x)) for x in lst]) 
+0

在join()方法中不需要使用方括號'[]'。你可以把它作爲生成器表達式 – juliomalegria 2012-02-04 22:28:03

+0

@ julio.alegria:你說得對,擺脫了[]'。 – 2012-02-04 22:31:17

+0

'join'必須建立一個列表(用於計算結果字符串的長度),因此使用列表理解而不是生成器表達式通常會更快。 – WolframH 2012-02-04 22:58:41

0

如果列表確實有確切結構(非列表元素在偶數位置,列表元素在奇數位置)你可以這樣做:

def pairs(l): 
    i = iter(l) 
    while 1: 
     yield (i.next(), i.next()) 
print '\n'.join(['%s %s' % (f, ' '.join(s)) for f, s in pairs(list)]) 
0

你可以使用標準"grouper" idiom遍歷以塊的列表(每次兩個項目):

L = [0, ['~', '~', '~'], 1, ['~', '~', '~'], 2, ['~', '~', '~']] 
print('\n'.join("%s %s" % (i, ' '.join(lst)) for i, lst in zip(*[iter(L)]*2))) 
Output
0 ~ ~ ~ 
1 ~ ~ ~ 
2 ~ ~ ~ 
2

不聰明或簡明其他的答案,但絕對可讀:

# This function is taken from 
# http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python 
def chunks(l, n): 
    """ Yield successive n-sized chunks from l. 
    """ 
    for i in xrange(0, len(l), n): 
     yield l[i:i+n] 

my_list = [0, ['~', '~', '~'], 1, ['~', '~', '~'], 2, ['~', '~', '~'] ] 

paired = chunks(my_list, 2) 

for index, lst in paired: 
    print index, ' '.join(lst) 
+1

使它成爲'索引,成對使用lst:'。 – 2012-02-04 22:42:52

+0

@Rob很好的建議。完成。 – 2012-02-05 01:29:15

0

使用沒有索引,沒有創建列表和子列表:

lst = [0, ['~', '~', '~'], 1, ['~', 889, '~'], 2, ['~', '~', ('a','b')], 3, ['#', '#'] ] 

it = iter(lst) 
print '\n'.join('%s %s' % (x,' '.join(str(u) for u in next(it))) for x in it) 

結果

0 ~ ~ ~ 
1 ~ 889 ~ 
2 ~ ~ ('a', 'b') 
3 # #