根据列表中的另一个元素附加列表并删除包含项目的列表

Append list based on another element in list and remove lists that contained the items

假设我有两个这样的列表:

list_all = [[['some_item'],'Robert'] ,[['another_item'],'Robert'],[['itemx'],'Adam'],[['item2','item3'],'Maurice]]

我想仅当它们位于单独的列表中时,由它们的持有者(即 'Robert')将它们组合在一起。即最后list_all应该包含:

list_all = [[['some_name','something_else'],'Robert'],[['itemx'],'Adam'],[['item2','item3'],'Maurice]]

什么是快速有效的方法? 我尝试过不同的方式,但我正在寻找更优雅、更简单的东西。 谢谢

这是一种解决方案。以更结构化的形式存储数据通常会更好,例如字典,而不是从一种列表格式转换为另一种格式。

from collections import defaultdict

list_all = [[['some_item'],'Robert'],
            [['another_item'],'Robert'],
            [['itemx'],'Adam'],
            [['item2','item3'],'Maurice']]

d = defaultdict(list)

for i in list_all:
    d[i[1]].extend(i[0])

# defaultdict(list,
#             {'Adam': ['itemx'],
#              'Maurice': ['item2', 'item3'],
#              'Robert': ['some_item', 'another_item']})

d2 = [[v, k] for k, v in d.items()]

# [[['some_item', 'another_item'], 'Robert'],
#  [['itemx'], 'Adam'],
#  [['item2', 'item3'], 'Maurice']]

你可以试试这个,虽然它与上面的答案非常相似,但你可以在不导入任何东西的情况下做到这一点。

list_all = [[['some_item'], 'Robert'], [['another_item'], 'Robert'], [['itemx'], 'Adam'], [['item2', 'item3'], 'Maurice']]

x = {}  # initializing a dictionary to store the data

for i in list_all:
    try:
        x[i[1]].extend(i[0])
    except KeyError:
        x[i[1]] = i[0]

list2 = [[j, i ] for i,j in x.items()]
list_all = [[['some_item'],'Robert'] ,[['another_item'],'Robert'],[['itemx'],'Adam'],[['item2','item3'],'Maurice']]

dict_value = {}
for val in list_all:
    list_, name = val
    if name in dict_value:
        dict_value[name][0].extend(list_)
    else:      
        dict_value.setdefault(name,[list_, name])
print(list(dict_value.values()))
>>>[[['some_item', 'another_item'], 'Robert'],
 [['itemx'], 'Adam'],
 [['item2', 'item3'], 'Maurice']]