繁体   English   中英

查找剩余数<=一些数字的列表元素对

[英]Find pairs of list elements that have remainder <= some number

假设我的目标数字是60。我有一个元素列表,我想找到一对数字,当它们相减时,其余数小于或等于60(绝对值是可以的)。 找到数字后,我想将它们添加到新列表中,而不要重复。

这是我的代码,但这提供了大量重复项。

new_days内容是: [353, 34, 172, 218, 356, 37, 83, 175, 267, 177, 269, 361, 88, 134, 180, 226, 272, 318, 364, 45] new_days [353, 34, 172, 218, 356, 37, 83, 175, 267, 177, 269, 361, 88, 134, 180, 226, 272, 318, 364, 45]

i, j = 0, 1

pairs = []

for i in range(len(new_days)):
    for j in range(len(new_days)):
        val = new_days[j] - new_days[i]
        val = abs(val)
        if val <= 60:
            pair = str(new_days[i]) + ' ' + str(new_days[j])
            pairs.append(pair)

我想保持代码尽可能的简洁和整洁,以便我的上司和同事都对Python有所了解,一旦需要完成任何更改,便可以理解。

为了按照给定的标准过滤所有对 ,您可以将itertools.combinations列表理解表达式一起使用:

>>> from itertools import combinations
>>> my_list = [353, 34, 172, 218, 356, 37, 83, 175, 267, 177, 269, 361, 88, 134, 180, 226, 272, 318, 364, 45]

#                                        filter criterion  v
>>> [(i,j) for i, j in combinations(my_list, 2) if abs(i-j)<=60]
[(353, 356), (353, 361), (353, 318), (353, 364), (34, 37), (34, 83), (34, 88), (34, 45), (172, 218), (172, 175), (172, 177), (172, 134), (172, 180), (172, 226), (218, 175), (218, 267), (218, 177), (218, 269), (218, 180), (218, 226), (218, 272), (356, 361), (356, 318), (356, 364), (37, 83), (37, 88), (37, 45), (83, 88), (83, 134), (83, 45), (175, 177), (175, 134), (175, 180), (175, 226), (267, 269), (267, 226), (267, 272), (267, 318), (177, 134), (177, 180), (177, 226), (269, 226), (269, 272), (269, 318), (361, 318), (361, 364), (88, 134), (88, 45), (134, 180), (180, 226), (226, 272), (272, 318), (318, 364)]

但是,如果要过滤仅连续数字对 ,则可以将zip列表推导表达式一起使用:

#    filter content on absolute value of consecutive number  v
>>> [(i, j) for i, j in zip(my_list, my_list[1:]) if abs(i-j)<=60]
[(172, 218), (37, 83), (88, 134), (134, 180), (180, 226), (226, 272), (272, 318), (318, 364)]

此代码段将遍历所有对(不以其他顺序重复):

for i, e1 in enumerate(data):
    for e2 in data[i+1:]:
        if abs(e1 - e2) <= 60:
            print(e1, e2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM