2013-01-11 42 views
3

我想将字符串列表连接成按列表中的值分组的新字符串。这里是我的意思的例子:按组连接字符串python

输入

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

结果

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

我了解如何加入文本。但我不知道如何正确迭代列表的值来聚合相同键值所共有的字符串。

任何帮助或建议表示赞赏。谢谢。

回答

8
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]) 
+0

玩得真好!我真的在过度思考这个问题。 –

+4

你如何从你的输出获得所需的输出? –

+2

这比'groupby'好,因为它不需要'keys'排序。 – georg

0

你可以zip(key,data)使用itertools.groupby()

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') 
+0

非常感谢Ashwini。 – bradj

2

使用itertools.groupby()功能元素结合起来;拉链让你组的两个输入列表分成两个输出列表:

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仅基于连续键相同的元素进行分组。另一方面,它确实保留了最初的排序顺序。

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) 
+0

但是...为什么......?如果内存服务,你也可以使用'newkeydata.setdefault(k,[])。append(d)',但是defaultdict更简洁。 – mgilson

+0

您在zip(key,data)中缺少k,d:<--- –

+0

在此之前有此参数:http://stackoverflow.com/questions/10654499/removing-duplicate-keys-from-python-dictionary-但求和最值/ 10654567#10654567 –

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

但我知道,这是相当难看,也许并不像其他的高性能解决方案。仅用于演示目的。 :)