繁体   English   中英

按组python连接字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM