2017-03-09 108 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) 

这样简单!

相关问题