[英]Concatenate strings by groups python
我想將一個字符串列表連接成一個按列表中的值分組的新字符串。 這是我的意思的一個例子:
輸入
key = ['1','2','2','3']
data = ['a','b','c','d']
結果
newkey = ['1','2','3']
newdata = ['a','b c','d']
我理解如何加入文字。 但我不知道如何正確迭代列表的值以聚合相同鍵值共有的字符串。
任何幫助或建議表示贊賞。 謝謝。
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])
使用itertools.groupby()
函數組合元素; zip將允許您將兩個輸入列表分組為兩個輸出列表:
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
僅將基於連續鍵的元素分組相同。 另一方面,它確實保留了初始排序順序。
你可以在zip(key,data)
上使用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')
如果您不想導入集合,則可以始終使用常規字典。
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)
只是為了多樣性,這里有一個沒有任何外部庫和沒有字典的解決方案:
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'])
但我知道它很丑陋,可能沒有其他解決方案那么高效。 僅供演示之用。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.