在列表列表中对元素进行分组

Arn*_*nab 2 python

我有一些记录如下:

list1= [['corner grant and main reef road, new state area, springs', 'springs'],
     ['corner grant and main reef road, new state area, springs', 'palm springs'],
     ['corner grant and main reef road, new state area, springs', 'edenvale']]
Run Code Online (Sandbox Code Playgroud)

我希望我的记录看起来像这样:

list2= ['corner grant and main reef road, new state area, springs', 'springs | palm springs | edenvale']
Run Code Online (Sandbox Code Playgroud)

我编写了以下代码来完成此任务:

for i in range(len(list1)-1):
    if list1[i][0] == list1[i+1][0]:
        list2.append([list1[i][0], list1[i][1] + "|" + list1[i + 1][1]])
    else:
        pass
Run Code Online (Sandbox Code Playgroud)

如果我在列表中有两个元素并且是连续的条目,则它会起作用,但如果有超过2个项目且不连续,则会失败.任何人都可以指出一个合适的方法来实现这一目标.

Ale*_*ung 5

您可以使用a dict进行分组.

为了方便起见,这defaultdict是一个很好的子类dict:

from collections import defaultdict
list1= [['corner grant and main reef road, new state area, springs', 'springs'],
     ['corner grant and main reef road, new state area, springs', 'palm springs'],
     ['corner grant and main reef road, new state area, springs', 'edenvale']]

def grouping(l):
    d = defaultdict(list)
    for key,value in l:
        d[key].append(value)
    for key in d:
        d[key] = ' | '.join(d[key])
    return list(d.items())
list2 = grouping(list1)
print(list2)
Run Code Online (Sandbox Code Playgroud)

输出:

[('corner grant and main reef road, new state area, springs', 'springs | palm springs | edenvale')]
Run Code Online (Sandbox Code Playgroud)

测试:

list3= [['corner grant and main reef road, new state area, springs', 'springs'],
        ['corner grant and main reef road, new state area, springs', 'palm springs'],
        ['corner grant and main reef road, new state area, springs', 'edenvale'],
        ['testing 1243','hi'],
        ['corner grant and main reef road, new state area, springs', '123456'],
       ]
print(grouping(list3)
Run Code Online (Sandbox Code Playgroud)

输出:

[('corner grant and main reef road, new state area, springs', 'springs | palm springs | edenvale | 123456'), ('testing 1243', 'hi')]
Run Code Online (Sandbox Code Playgroud)

如果您需要保留订单,请OrderedDict改用:

from collections import OrderedDict
def grouping(l):
    d = OrderedDict()
    for key,value in l:
        d.setdefault(key, []).append(value)
    for key in d:
        d[key] = ' | '.join(d[key])
    return list(d.items())
Run Code Online (Sandbox Code Playgroud)