基于值对Python中的两个列表进行分组

时间:2015-11-02 12:35:02

标签: python python-2.7

我在Python中有两个列表。

list1 = ['a','a','b','a','c','b','c','a','d','a','b']
list2 = ['1','2','21','12','1','32','11','12','21','3','31']

我必须对list1中的类似元素进行分组。 list2中的相应元素也应该基于此进行分组。输出应为:

list1 = [['a','a','a','a','a'],['b','b','b'],['c','c'],['d']]
list2 = [['1','2','12','12','3'],['21','32','31'],['1','11'],['21']]

这样做的最佳方式是什么?

6 个答案:

答案 0 :(得分:2)

如果您不关心第一个列表中元素的顺序,可以使用defaultdict

In [7]: from collections import defaultdict

In [8]: from itertools import izip

In [9]: res = defaultdict(list)

In [10]: for k, v in izip(list1, list2):
   ....:     res[k].append(v)
   ....:     

In [11]: print(res)
defaultdict(<type 'list'>, {'a': ['1', '2', '12', '12', '3'], 'c': ['1', '11'], 'b': ['21', '32', '31'], 'd': ['21']})

In [12]: res.items()
Out[12]: 
[('a', ['1', '2', '12', '12', '3']),
 ('c', ['1', '11']),
 ('b', ['21', '32', '31']),
 ('d', ['21'])]

答案 1 :(得分:1)

此代码应该这样做:

final_list1 = []
final_list2 = []

for distinct in sorted(list(set(list1))):
    index = 0
    distinct_list1 = []
    distinct_list2 = []
    for element in list1:
        if element == distinct:
            distinct_list1.append(element)
            distinct_list2.append(list2[index])
        index += 1
    final_list1.append(distinct_list1)
    final_list2.append(distinct_list2)

list1 = final_list1
list2 = final_list2

这将为您提供您要求的输出。如果你真的不关心输出,可能会有更好的方法@soon

答案 2 :(得分:1)

此代码对我有用:

groups = list(set(list1))
list1_tmp, list2_tmp = [], []
for char in groups:
   list1_tmp.append([])
   list2_tmp.append([])

for i in range(len(list1)):
   list1_tmp[groups.index(list1[i])].append(list1[i])
   list2_tmp[groups.index(list1[i])].append(list2[i])

list1 = list1_tmp
list2 = list2_tmp

对于任何其他类似的输入,输出也应该有效。

答案 3 :(得分:1)

这是一种(一种丑陋的)实现方法,可以解决这个问题:

list1 = ['a','a','b','a','c','b','c','a','d','a','b']
list2 = ['1','2','21','12','1','32','11','12','21','3','31']

def transform(in_list, other_list):
    if len(in_list) != len(other_list):
        raise ValueError("Lists must have the sema length!")
    out_list = list()
    out_other_list = list()
    for i, c in enumerate(in_list):
        for inner_list, inner_other_list in zip(out_list, out_other_list):
            if c in inner_list:
                inner_list.append(c)
                inner_other_list.append(other_list[i])
                break
        else:
            out_list.append([c])
            out_other_list.append([other_list[i]])
    return out_list, out_other_list

print transform(list1, list2)

答案 4 :(得分:1)

虽然我个人喜欢soon's answer,但是这个成功地检索了你想要的输出。

lst= sorted(zip(list1,list2),key=lambda x:x[0])

intList=[]

initial=lst[0][0]
count=0

for index,value in enumerate(lst):
    if value[0]==initial:
        continue
    else:
        intList.append(lst[count:index])
        initial=value[0]
        count=index

finList1=[[a for a,b in innerList] for innerList in intList]
finList2=[[b for a,b in innerList] for innerList in intList]

答案 5 :(得分:-1)

可以使用itertools.groupby对第一个案例进行分组:

groups = list()
for k, group in itertools.groupby(list1):
    groups.append(list(group))

第二个同样基于你的keyfunc。详细了解itertools.groupby