puffballjack
puffballjack

Reputation: 59

How can I join a list in python after an 'n' number of commas?

How can I take a large list like this:

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']

and make it to where after every twentieth number it joins it with a semi colon and space, ('; ') and every other time it just joins it with a space?

It would look something like this except larger:

"8 22 2 97; 58 33 44 82; 86..." and so on.

Upvotes: 2

Views: 585

Answers (7)

litepresence
litepresence

Reputation: 3277

method 1

modulus gives you the division remainder; so create a blank string, add every item in list and seperate by space or semicolon depending on item number:

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

method 2

first add semicolon to every 20th item in list; then convert to string and remove commas and quotes:

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

Upvotes: 0

shiyon sufa
shiyon sufa

Reputation: 343

string = ''

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

print(string)

simple as this!

Upvotes: 0

steliosbl
steliosbl

Reputation: 8921

Simple iteration approach:

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

Basically we go through each element of the list, joining it to the result string. Using the counter var, we can add a semicolon every 20 iterations by checking if it's value is 20 each time around. Once it reaches 20, we add the semicolon and reset its value to 0.

Upvotes: 0

Bendik
Bendik

Reputation: 1167

Something like this, maybe?

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

Join a section of length n: ' '.join(line[i:i+n]), Doing this for all the sections, and join the resulting list with the second delimiter, ': '.

Upvotes: 1

m_callens
m_callens

Reputation: 6360

Using an enumeration of your line list, you can use the index to specify when it should be a ; on multiples of 20...

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

Upvotes: 0

Jean-François Fabre
Jean-François Fabre

Reputation: 140196

easy with a list comprehension and 2 nested str.join:

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

You slice the list to take every 20 elements for the inner part, to create the list of space separated strings, and join the resulting list with your "outer" separator.

It works even if the list size isn't dividable by 20 and is super fast

(note that I'm forcing list creation for the outside join because join needs to create a list anyway. It's faster than passing a generator comprehension in that case)

Upvotes: 4

Nf4r
Nf4r

Reputation: 1410

You can do something like:

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

Upvotes: -1

Related Questions