nutship
nutship

Reputation: 4924

Splitting tuple item in a list

How do I split the 2nd tuple

data = [('152', 'Farko', 'Kier'), ('153', 'Park - Pub')]

to get this output:

[('152', 'Farko', 'Kier'), ('153', 'Park',  'Pub')]

I tried this way:

lst = []
for i in data:
    if len(i) == 2:
        i[1] = tuple(i[1].split(' - '))
    lst.append(i)

It'd work, except it raised an exception TypeError: 'tuple' object does not support item assignment. But I can't assign i = tuple(i[1].split(' - ')) because I need to keep the number which is in position i[0] in tuple. List comprehansion solution would be greatly welcome. Suggestions?

Upvotes: 2

Views: 9189

Answers (3)

Andrew Clark
Andrew Clark

Reputation: 208475

As you have seen you can't modify the tuple, however you can just create a new one with the data you want:

data = [('152', 'Farko', 'Kier'), ('153', 'Park - Pub')]
lst = []
for i in data:
    if len(i) == 2:
        i = i[:1] + tuple(i[1].split(' - '))
    lst.append(i)

Or if you want to modify the original list:

for i, tup in enumerate(data):
    if len(tup) == 2:
        data[i] = tup[:1] + tuple(tup[1].split(' - '))

Upvotes: 1

khachik
khachik

Reputation: 28693

newdata = [tuple(s for t in tu for s in t.split(' - ')) for tu in data]
# [('152', 'Farko', 'Kier'), ('153', 'Park', 'Pub')]

Upvotes: 2

Martijn Pieters
Martijn Pieters

Reputation: 1121992

You could use a list comprehension:

lst = [t[:1] + tuple(t[1].split(' - ')) if len(t) == 2 else t for t in data]

or you could adjust your loop to create a new tuple:

for i in data:
    if len(i) == 2:
        i = i[:1] + tuple(i[1].split(' - '))
    lst.append(i)

Upvotes: 2

Related Questions