gpt4 book ai didi

python - 迭代一对可迭代对象,按属性排序

转载 作者:太空狗 更新时间:2023-10-30 02:47:02 25 4
gpt4 key购买 nike

迭代一对可迭代对象的一种方法(最快的方法?)ab in sorted order 是将它们链接起来并对链接的 iterable 进行排序:

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

例如,如果每个可迭代对象的元素是:

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

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

1, 3, 4, 6, 8

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

  1. 迭代特定对象的最快方法是什么对象的属性,按此属性排序?

  2. 如果要选择的属性在可迭代对象之间不同怎么办?如果可迭代 ab都遍历 foo 类型的对象,具有属性 foo.xfoo.y相同类型的,如何迭代 a 的元素?按 x 排序和 by 排序?

以#2为例,如果

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

和以前一样。请注意,只有 x来自 a 的属性和 y来自 b 的属性输入排序和结果。

最佳答案

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 - 迭代一对可迭代对象,按属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17633868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com