0

データのタプルのリストがあります:

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

私がこれをするのを手伝ってください。

4

6 に答える 6

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 fined_data)))、この行を使用してコードをフラット化しましたが、次のエラーが表示されました: "type object *の後の引数は、ジェネレータではなくシーケンスである必要があります」、単純な分割は、スペースや特殊文字を使用してもすべての単語を分割します。助けてください

オプション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)))
于 2013-03-06T07:38:28.593 に答える
1

3番目の要素はコンマ区切りの文字列であるため、その存在を確認し、それに応じて分割できます

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')]
于 2013-03-06T06:31:42.270 に答える
0

だから私はこの問題をもっとpythonicで解決できると思います、そして私のコードは次のとおりです:

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')]
于 2013-03-06T06:54:38.957 に答える
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:これは元の順序を維持しない可能性があります。

于 2013-03-06T06:29:04.943 に答える
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

これは順序を保持しますが、新しいリストで動作します(適切ではありません)。必要に応じて、その場で作成します。

于 2013-03-06T06:31:45.957 に答える
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

これは私ができる限りpythonicです...

出力:

[('Date', 'Type', 'Product'), 
('2013/03/07', 'Electronic', 'TV'), 
('2013/03/07', 'Electronic', 'Radio'), 
('2013/03/07', 'Electronic', 'Microwave'), 
('2013/03/07', 'leather', 'Gucci Wallet')]
于 2013-03-06T09:25:12.460 に答える