3

文字列のリストを、リスト内の値にグループ化された新しい文字列に連結したいと思います。これが私が意味することの例です:

入力

key = ['1','2','2','3']
data = ['a','b','c','d']

結果

newkey = ['1','2','3']
newdata = ['a','b c','d']

テキストを結合する方法を理解しています。しかし、リストの値を正しく反復して、同じキー値に共通する文字列を集約する方法がわかりません。

ヘルプや提案をいただければ幸いです。ありがとう。

4

5 に答える 5

10
from collections import defaultdict

d = defaultdict(list)

for k, v in zip(key, data):
    d[k].append(v)

print [(k, ' '.join(v)) for k, v in d.items()]

出力:

[('1', 'a'), ('3', 'd'), ('2', 'b c')]

そして、新しいリストを取得する方法:

newkey, newvalue = d.keys(), [' '.join(v) for v in d.values()]

そして保存された順序で:

newkey, newvalue = zip(*[(k, ' '.join(d.pop(k))) for k in key if k in d])
于 2013-01-11T14:27:05.820 に答える
2

関数を使用itertools.groupby()して要素を結合します。zipを使用すると、2つの入力リストを2つの出力リストにグループ化できます。

import itertools
import operator

newkey, newdata = [], []
for key, items in itertools.groupby(zip(key, data), key=operator.itemgetter(0)):
    # key is the grouped key, items an iterable of key, data pairs
    newkey.append(key)
    newdata.append(' '.join(d for k, d in items))

これをもう少しzip()魔法のリスト内包表記に変えることができます。

from itertools import groupby
from operator import itemgetter

newkey, newdata = zip(*[(k, ' '.join(d for _, d in it)) for k, it in groupby(zip(key, data), key=itemgetter(0))])

これには、入力をソートする必要があることに注意してください。groupby同じである連続するキーに基づいて要素のみをグループ化します。一方、それはその最初のソートされた順序を保持します。

于 2013-01-11T14:27:01.047 に答える
0

多様性のために、外部ライブラリや辞書がなくても機能するソリューションを次に示します。

def group_vals(keys, vals):
    new_keys= sorted(set(keys))
    zipped_keys = zip(keys, keys[1:]+[''])
    zipped_vals = zip(vals, vals[1:]+[''])
    new_vals = []
    for i, (key1, key2) in enumerate(zipped_keys):
        if key1 == key2:
            new_vals.append(' '.join(zipped_vals[i]))
        else:
            new_vals.append(zipped_vals[i][0])
    return new_keys, new_vals

group_vals([1,2,2,3], ['a','b','c','d'])
# --> ([1, 2, 3], ['a', 'b c', 'd'])

しかし、それはかなり醜く、おそらく他のソリューションほどパフォーマンスが良くないことを私は知っています。デモンストレーションの目的で。:)

于 2013-01-11T15:14:44.277 に答える
0

あなたはで使用することができitertools.groupby()ますzip(key,data)

In [128]: from itertools import *

In [129]: from operator import *

In [133]: lis=[(k," ".join(x[1] for x in g)) for k,g in groupby(zip(key,data),key=itemgetter(0))]

In [134]: newkey,newdata=zip(*lis)

In [135]: newkey
Out[135]: ('1', '2', '3')

In [136]: newdata
Out[136]: ('a', 'b c', 'd')
于 2013-01-11T14:26:27.457 に答える
0

コレクションをインポートしたくない場合は、いつでも通常の辞書を使用できます。

key = ['1','2','2','3']
data = ['a','b','c','d']
newkeydata = {}

for k,d in zip(key,data):
    newkeydata[k] = newkeydata.get(k, []).append(d)
于 2013-01-11T14:31:37.120 に答える