2013-03-06 2 views
0

У меня есть список кортежей данных:Как сгладить список элементов в кортеже, используя python?

data = [('Date', 'Type', 'Product'), 
     ('2013/03/07', 'Electronic', 'TV, Radio, Microwave'), 
     ('2013/03/07', 'leather', 'Gucci Wallet')] 

Я хочу, чтобы дублировать и сделать список проще, как это мои данные:

data = [('Date', 'Type', 'Product'), 
     ('2013/03/07', 'Electronic', 'TV'), 
     ('2013/03/07', 'Electronic', 'Radio'), 
     ('2013/03/07', 'Electronic', 'Microwave'), 
     ('2013/03/07', 'leather', 'Gucci Wallet')] 

Пожалуйста, помогите мне сделать это.

+0

Я попытался вложенными ' для 'петель для решения этой проблемы, но не смог это сделать! :( – MHS

ответ

4

Хорошей задачи использовать itertools.

Прочитайте решение как Свести список пар элементов, порожденных расщеплением с ''

list(chain(*(product(*imap(str.split, e)) for e in data))) 

И здесь является демонстрация

>>> from pprint import PrettyPrinter 
>>> pp = PrettyPrinter(indent = 4) 
>>> data = [('Date', 'Type', 'Product'), 
     ('2013/03/07', 'Electronic', 'TV, Radio, Microwave'), 
     ('2013/03/07', 'leather', 'Gucci Wallet')] 
>>> from itertools import izip, imap, product, chain 
>>> data = list(chain(*(product(*imap(str.split, e)) for e in data))) 
>>> pp.pprint(data) 
[ ('Date', 'Type', 'Product'), 
    ('2013/03/07', 'Electronic', 'TV,'), 
    ('2013/03/07', 'Electronic', 'Radio,'), 
    ('2013/03/07', 'Electronic', 'Microwave'), 
    ('2013/03/07', 'leather', 'Gucci'), 
    ('2013/03/07', 'leather', 'Wallet')] 

Обновление от OP

data = list(chain(*(product(*imap(str.split(','), e)) for e in refined_data))) , I used this line to flatten my code but it showed this error: "type object argument after * must be a sequence, not generator", the simple split breaks all the words even with space and any special character, please help me

Вариант 1:

>>> from operator import methodcaller 
>>> list(chain(*(product(*imap(methodcaller("split", ","), e)) for e in data))) 

Вариант 2:

>>> list(chain(*(product(*(s.split(",") for s in e)) for e in data))) 
+0

data = list (chain (* (product (* imap (str.split (','), e)) для e в refined_data))), я использовал эту строку, чтобы сгладить мой код, но он показал эту ошибку: «Аргумент типа объекта после * должен быть последовательностью, а не генератором», простое разделение прерывает все слова даже с пространством и любым специальным символом, пожалуйста, помогите мне ... – MHS

+0

@RoBErT: см. обновленный ответ – Abhijit

0

Этот код должен помочь вам упростить ваши данные.

data = [('Date', 'Type', 'Product'), ('2013/03/07', 'Electronic', 'TV, Radio, Microwave'), ('2013/03/07', 'leather', 'Gucci Wallet')] 

for tup in data: 
    items=tup[2].split(','); 
    if len(items)>1: 
     date=tup[0]; 
     typ=tup[1]; 
     data.remove(tup); 
     for i in items: 
      data.append(tuple([date,typ,i])); 

PS: Это не может сохранить первоначальный заказ.

1

, так как третий элемент, разделенных запятыми, вы можете проверить это существование и разделить соответственно

In [131]: data 
Out[131]: 
[('Date', 'Type', 'Product'), 
('2013/03/07', 'Electronic', 'TV, Radio, Microwave'), 
('2013/03/07', 'leather', 'Gucci Wallet')] 

In [132]: data2 = [] 

In [133]: for item in data: 
    .....:  if item[2].find(',') > -1: 
    .....:   x = [(item[0], item[1], x.strip()) for x in item[2].split(',')] 
    .....:   for i in x: 
    .....:    data2.append(i) 
    .....:  else: 
    .....:   data2.append(item) 
    .....: 

In [134]: data2 
Out[134]: 
[('Date', 'Type', 'Product'), 
('2013/03/07', 'Electronic', 'TV'), 
('2013/03/07', 'Electronic', 'Radio'), 
('2013/03/07', 'Electronic', 'Microwave'), 
('2013/03/07', 'leather', 'Gucci Wallet')] 
0

Я думаю, что способ сделать это было бы

def mycopy(lst): 
    newlst = [] 
    for tup in lst: 
     newitems = tup[-1].split(',') 
     rest = tup[:-1] 
     for i in newitems: 
      newlst.append(rest+(i,)) 
    return newlst 

Это сохраняет порядок, но работает над новым списком (не на месте). При необходимости я напишу на месте.

0

Так что я думаю, что у меня есть еще вещий решить эту проблему, и мой код:

result_lst = [] 
for tup in data[1:]: 
    result_lst+=[tup[0:2] + tuple([product]) for product in tup[2].split(',')] 
print result 
OUT: 
[('2013/03/07', 'Electronic', 'TV'), 
('2013/03/07', 'Electronic', ' Radio'), 
('2013/03/07', 'Electronic', ' Microwave'), 
('2013/03/07', 'leather', 'Gucci Wallet')] 
0
result = data[:1] 
for item in data[1:]: 
    (date, category, products) = item 
    result.extend(map(lambda product: (date, category, product), tuple(products.split(', ')))) 

print result 

Это, как вещий, как я мог ...

выход:

[('Date', 'Type', 'Product'), 
('2013/03/07', 'Electronic', 'TV'), 
('2013/03/07', 'Electronic', 'Radio'), 
('2013/03/07', 'Electronic', 'Microwave'), 
('2013/03/07', 'leather', 'Gucci Wallet')] 
Смежные вопросы