ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 迭代一对迭代,按属性排序

2019-06-20 10:18:01  阅读:149  来源: 互联网

标签:python iterable-unpacking


以排序顺序迭代一对迭代a和b的一种方法(最快的方法?)是链接它们并对链式迭代进行排序:

for i in sorted(chain(a, b)):
    print i

例如,如果每个iterable的元素是:

a: 4, 6, 1
b: 8, 3

然后这个构造将按顺序生成元素

1, 3, 4, 6, 8

但是,如果迭代迭代对象,则按对象的内存地址对对象进行排序.假设每个iterable迭代相同类型的对象,

>迭代特定的最快方法是什么
对象的属性,按此属性排序?
>如果要选择的属性在迭代之间有所不同怎么办?如果迭代a和b都迭代foo类型的对象,它们具有相同类型的属性foo.x和foo.y,那么如何迭代按x排序的元素和按y排序的b?

对于#2的示例,if

a: (x=4,y=3), (x=6,y=2), (x=1,y=7)
b: (x=2,y=8), (x=2,y=3)

那么元素应该按顺序生成

1, 3, 4, 6, 8

像之前一样.请注意,只有来自a的x属性和来自b的y属性才能进入排序和结果.

解决方法:

Tim Pietzcker已经回答了你为每个可迭代使用相同属性的情况.如果您使用相同类型的不同属性,则可以这样做(使用复数作为具有两个相同类型属性的现成类):

在Python 2中:

>>> a = [1+4j, 7+0j, 3+6j, 9+2j, 5+8j]
>>> b = [2+5j, 8+1j, 4+7j, 0+3j, 6+9j]
>>> keyed_a = ((n.real, n) for n in a)
>>> keyed_b = ((n.imag, n) for n in b)
>>> from itertools import chain
>>> sorted_ab = zip(*sorted(chain(keyed_a, keyed_b), key=lambda t: t[0]))[1]
>>> sorted_ab
((1+4j), (8+1j), (3+6j), 3j, (5+8j), (2+5j), (7+0j), (4+7j), (9+2j), (6+9j))

由于在Python 3中zip()返回一个迭代器,我们需要在尝试下标之前将其强制转换为列表:

>>> # ... as before up to 'from itertools import chain'
>>> sorted_ab = list(zip(*sorted(chain(keyed_a, keyed_b), key=lambda t: t[0])))[1]
>>> sorted_ab
((1+4j), (8+1j), (3+6j), 3j, (5+8j), (2+5j), (7+0j), (4+7j), (9+2j), (6+9j))

标签:python,iterable-unpacking
来源: https://codeday.me/bug/20190620/1243159.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有