List 合并具有相同第一个索引但具有其他第二个索引的列表

List 合并具有相同第一个索引但具有其他第二个索引的列表,list,sorting,python-3.x,merge,List,Sorting,Python 3.x,Merge,我正在用python开发一个搜索算法,但有些东西我还没有开始工作 我有一个列表,看起来像这样[[“a”,“1.txt”],[“a”,“2.txt”],[“a”,“3.txt”],[“B”,“1.txt”],[“B”,“3.txt”]] 现在我想合并具有相同第一个索引的子列表。因此,结果将是: [“A”、[“1.txt”、“2.txt”、“3.txt”]、[“B”、[“1.txt”]、[“3.txt”]] 任何知道怎么做的人。。。 有点像是得到了排序(基于mergesort),但这不会合并元组 d

我正在用python开发一个搜索算法,但有些东西我还没有开始工作

我有一个列表,看起来像这样[[“a”,“1.txt”],[“a”,“2.txt”],[“a”,“3.txt”],[“B”,“1.txt”],[“B”,“3.txt”]]

现在我想合并具有相同第一个索引的子列表。因此,结果将是:

[“A”、[“1.txt”、“2.txt”、“3.txt”]、[“B”、[“1.txt”]、[“3.txt”]]

任何知道怎么做的人。。。 有点像是得到了排序(基于mergesort),但这不会合并元组

def merge_pairs(data):
if len(data) <= 1 :
    return data[:]
else:
        mid = len(data) // 2
        fst = merge_pairs(data[:mid])
        snd = merge_pairs(data[mid:])   
        res = []
        fi = 0
        si = 0
        while fi < len(fst) and si < len(snd):
            if fst[fi][0] < snd[si][0] or fst[fi][0] == snd[si][0] and fst[fi][1] < snd[si][1]:
                res.append(fst[fi])
                fi = fi + 1
            else:
                res.append(snd[si])
                si = si + 1
        if fi < len(fst) :
            res.extend(fst[fi:])
        elif si < len(snd) :
            res.extend(snd[si:])
return res
def合并对(数据):
如果len(data)最简单的方法(可能比困难的方法慢,也可能不慢)是使用defaultdict:

>>> from collections import defaultdict
>>> result = defaultdict(list)
>>> mylist = [["A","1.txt"],["A","2.txt"],["A","3.txt"],["B","1.txt"],["B","3.txt"]]
>>> for key, value in mylist:
...     result[key].append(value)
... 
>>> print(sorted(result.items()))
[('A', ['1.txt', '2.txt', '3.txt']), ('B', ['1.txt', '3.txt'])]
困难的方法(如果您的数据确实已经排序):

但请注意,Python排序非常非常快,Python循环是这样的……不多

编辑根据您下面的评论,您还需要计数。还有一种字典方式:

>>> from collections import defaultdict
>>> result = defaultdict(lambda: defaultdict(int))
>>> mylist = [["A","1.txt"],["A","2.txt"],["A", "2.txt"],["A","3.txt"],["B","1.txt"],["B","3.txt"]]
>>> for key, value in mylist:
...     result[key][value] += 1
... 
>>> print(sorted((x, sorted(y.items())) for (x, y) in result.items()))
[('A', [('1.txt', 1), ('2.txt', 2), ('3.txt', 1)]), ('B', [('1.txt', 1), ('3.txt', 1)])]
和一个循环方式:

>>> src = [["A","1.txt"],["A","2.txt"],["A", "2.txt"],["A","3.txt"],["B","1.txt"],["B","3.txt"]]
>>> prevkey, prevvalue = None, None
>>> dst = []
>>> for key, value in src:
...     if key != prevkey:
...         prevkey = key
...         prevvalue = None
...         dst.append((key, []))
...     if value != prevvalue:
...         prevvalue = value
...         dst[-1][-1].append([value, 0])
...     dst[-1][-1][-1][-1] += 1
... 
>>> dst
[('A', [['1.txt', 1], ['2.txt', 2], ['3.txt', 1]]), ('B', [['1.txt', 1], ['3.txt', 1]])]

您确实希望运行timeit,但在本例中,循环方式看起来几乎肯定会慢一些(当然,字典方式不需要您进行预排序。)

是否有任何方法也可以在这个元组列表中获得一个计数值。因此:[“a”,“2.txt”,“a”,“2.txt”]]将是[('a',['2.txt,2')],而不是[('A',['2.txt')]@MartijnLinders——我已经用它更新了答案,所以请编辑你的问题,在最后问这个问题,以便我的答案与问题正确匹配,然后如果答案看起来可以接受,请接受。
>>> src = [["A","1.txt"],["A","2.txt"],["A", "2.txt"],["A","3.txt"],["B","1.txt"],["B","3.txt"]]
>>> prevkey, prevvalue = None, None
>>> dst = []
>>> for key, value in src:
...     if key != prevkey:
...         prevkey = key
...         prevvalue = None
...         dst.append((key, []))
...     if value != prevvalue:
...         prevvalue = value
...         dst[-1][-1].append([value, 0])
...     dst[-1][-1][-1][-1] += 1
... 
>>> dst
[('A', [['1.txt', 1], ['2.txt', 2], ['3.txt', 1]]), ('B', [['1.txt', 1], ['3.txt', 1]])]