List 合并具有相同第一个索引但具有其他第二个索引的列表
我正在用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),但这不会合并元组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
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]])]