2017-03-09 66 views
2

我如何可以採取一個大名單如下:如何在'n'個逗號之後加入python中的列表?

line = ['8', '2', '22', '97', '38', '15', '0', '40', '0', '75', '4', '5', '7', '78', '52', '12', '50', '77', '91', '8', '49', '49', '99', '40', '17', '81', '18', '57', '60', '87', '17', '40', '98', '43', '69', '48', '4', '56', '62', '0', '81', '49', '31', '73', '55', '79', '14', '29', '93', '71', '40', '67', '53', '88', '30', '3', '49', '13', '36', '65', '52', '70', '95', '23', '4', '60', '11', '42', '69', '24', '68', '56', '1', '32', '56', '71', '37', '2', '36', '91', '22', '31', '16', '71', '51', '67', '63', '89', '41', '92', '36', '54', '22', '40', '40', '28', '66', '33', '13', '80', '24', '47', '32', '60', '99', '3', '45', '2', '44', '75', '33', '53', '78', '36', '84', '20', '35', '17', '12', '50', '32', '98', '81', '28', '64', '23', '67', '10', '26', '38', '40', '67', '59', '54', '70', '66', '18', '38', '64', '70', '67', '26', '20', '68', '2', '62', '12', '20', '95', '63', '94', '39', '63', '8', '40', '91', '66', '49', '94', '21', '24', '55', '58', '5', '66', '73', '99', '26', '97', '17', '78', '78', '96', '83', '14', '88', '34', '89', '63', '72', '21', '36', '23', '9', '75', '0', '76', '44', '20', '45', '35', '14', '0', '61', '33', '97', '34', '31', '33', '95', '78', '17', '53', '28', '22', '75', '31', '67', '15', '94', '3', '80', '4', '62', '16', '14', '9', '53', '56', '92', '16', '39', '5', '42', '96', '35', '31', '47', '55', '58', '88', '24', '0', '17', '54', '24', '36', '29', '85', '57', '86', '56', '0', '48', '35', '71', '89', '7', '5', '44', '44', '37', '44', '60', '21', '58', '51', '54', '17', '58', '19', '80', '81', '68', '5', '94', '47', '69', '28', '73', '92', '13', '86', '52', '17', '77', '4', '89', '55', '40', '4', '52', '8', '83', '97', '35', '99', '16', '7', '97', '57', '32', '16', '26', '26', '79', '33', '27', '98', '66', '88', '36', '68', '87', '57', '62', '20', '72', '3', '46', '33', '67', '46', '55', '12', '32', '63', '93', '53', '69', '4', '42', '16', '73', '38', '25', '39', '11', '24', '94', '72', '18', '8', '46', '29', '32', '40', '62', '76', '36', '20', '69', '36', '41', '72', '30', '23', '88', '34', '62', '99', '69', '82', '67', '59', '85', '74', '4', '36', '16', '20', '73', '35', '29', '78', '31', '90', '1', '74', '31', '49', '71', '48', '86', '81', '16', '23', '57', '5', '54', '1', '70', '54', '71', '83', '51', '54', '69', '16', '92', '33', '48', '61', '43', '52', '1', '89', '19', '67', '48'] 

,並使其到每二十號後,用分號和空間加入它,(「;」)和所有其他的時間它只是加入它有一個空間?

它看起來像這樣除了較大:

「8 22 2 97 58 33 44 82 86 ...」 等。

+0

你的問題很好。你很幸運,不會偶然發現「你在哪裏」的警察:) –

回答

4

易於使用列表理解和2套str.join

"; ".join([" ".join(line[i:i+20]) for i in range(0,len(line),20)]) 

您對列表進行切片,以獲取內部部分的每20個元素,創建空格分隔字符串列表,並將結果列表與「外部」分隔符結合在一起。

它的工作原理,即使列表大小不是整除20和超快

(請注意,我強迫列表的創建對於外界join因爲join需求仍然要創建一個列表。它比快通過在這種情況下,一臺發電機理解)

+0

打倒我吧...關於強制創建列表的好消息,不知道加入是否做到了這一點。很高興知道! – Bendik

+0

和你的答案仍然是正確的pythonic。創建一個傳遞'n'的函數是一個很好的接觸。 –

+0

謝謝!我理解了大部分解決方案,但林不知道我在這裏得到了什麼:range(0,len(line),20)?你能解釋一下嗎? – puffballjack

0

簡單的迭代方法:

counter = 0 
result = "" 
for num in line: 
    counter += 1 
    result += str(num) 
    if counter == 20: 
     result += ";" 
     counter = 0 
    result += " " 

基本上我們通過列表中的每個元素,它加入到result字符串。通過使用counter var,我們可以每20次迭代添加一個分號,通過檢查每次迭代的值是否爲20。一旦達到20,我們添加了分號,並將其值重置爲0。

+0

,仍然表現很差,因爲它花費時間連接字符串。 –

-1

你可以這樣做:

length = 20 
result = '; '.join((' '.join(line[idx: idx + length]) for idx in range(len(line) - n))) 
+2

不是downvoter,但你的代碼1)沒有解釋和2)不工作,因爲元素是重複的 –

0

使用您的線路list的枚舉,你可以使用索引來指定,當它應該是20的倍數爲; ...

joined = '' 
for i, num in enumerate(line): 
    joined += str(num) 
    joined += ' ' if (i + 1) % 20 != 0 else '; ' 
+0

雖然有效,但它仍然非常糟糕的表現,因爲它花費時間連接字符串。 –

+0

@ Jean-FrançoisFabre是不是''join'函數在底層做了什麼? –

+0

不,「join」函數知道字符串的大小,所以它直接預先分配正確的大小,而不是不斷地重新分配/增加字符串大小。對於列表來說沒有什麼不好,對於字符串來說是不好的這就是爲什麼你不能在字符串上執行sum()的原因之一。 –

1

這樣的事情,也許?

def joinit(line, n): 
    return ': '.join(' '.join(line[i:i+n]) for i in range(0, len(line), n)) 

加入長度n的部分:' '.join(line[i:i+n]), 這樣做的所有部分,並與第二限定,': '加入結果列表。

0

方法1

模數給你除法餘數;所以創建一個空字符串,列表和單獨通過取決於項目數空間或分號添加每一個項目:

new_string = '' 
z= len(line) 
for i in range(z): 
    new_string += (line[i]) 
    if (i%20==0) and (z>i>0): 
     new_string += '; ' 
    else: 
     new_string += ' ' 
print new_string 

方法2

第一附加分號在列表中的每20項;然後轉換爲字符串,刪除逗號和報價:

for i in range(1,(len(line)-1)): 
    if i%20==0: line[i]+=';' 
line = (((str(line)[:-1:])[1:]).replace("'",'')).replace(",",'') 
0
string = '' 

for a in line: string+= a+'?' if (line.index(a)+1) % 20 else a+'!' 

print(string) 

這樣簡單!

相關問題