python 连续比较_比较Python中连续元组列表的第一个元素

您可以使用

OrderedDict按元组的第一个子元素对元素进行分组:

myList=[(1,2),(1,3),(1,4),(1,5),(2,6),(2,7),(2,8),(3,9),(3,10)]

from collections import OrderedDict

od = OrderedDict()

for a,b in myList:

od.setdefault(a,[]).append(b)

print(list(od.values()))

[[2, 3, 4, 5], [6, 7, 8], [9, 10]]

如果你真的想要元组:

print(list(map(tuple,od.values())))

[(2, 3, 4, 5), (6, 7, 8), (9, 10)]

如果您不关心元素出现的顺序,只想要最有效的分组方式,您可以使用collections.defaultdict:

from collections import defaultdict

od = defaultdict(list)

for a,b in myList:

od[a].append(b)

print(list(od.values()))

最后,如果您的数据按照您的输入示例排序,即排序,您只需使用itertools.groupby按每个元组的第一个子元素进行分组,并从分组的元组中提取第二个元素:

from itertools import groupby

from operator import itemgetter

print([tuple(t[1] for t in v) for k,v in groupby(myList,key=itemgetter(0))])

输出:

[(2, 3, 4, 5), (6, 7, 8), (9, 10)]

再次,只有当您的数据至少按第一个元素排序时,groupby才会起作用.

在合理大小的列表上的一些时间:

In [33]: myList = [(randint(1,10000),randint(1,10000)) for _ in range(100000)]

In [34]: myList.sort()

In [35]: timeit ([tuple(t[1] for t in v) for k,v in groupby(myList,key=itemgetter(0))])

10 loops, best of 3: 44.5 ms per loop

In [36]: %%timeit od = defaultdict(list)

for a,b in myList:

od[a].append(b)

....:

10 loops, best of 3: 33.8 ms per loop

In [37]: %%timeit

dictionary = OrderedDict()

for x, y in myList:

if x not in dictionary:

dictionary[x] = [] # new empty list

dictionary[x].append(y)

....:

10 loops, best of 3: 63.3 ms per loop

In [38]: %%timeit

od = OrderedDict()

for a,b in myList:

od.setdefault(a,[]).append(b)

....:

10 loops, best of 3: 80.3 ms per loop

如果订单很重要并且数据已经排序,那么请使用groupby,如果有必要将所有元素映射到defaultdict中的元组,它将更接近defaultdict方法.

如果数据未排序或您不关心任何订单,您将找不到比使用defaultdict方法更快的分组方法.

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值