首页 > 解决方案 > 递归比较列表中的项目

问题描述

我生成了一个唯一的字符串列表。每个字符串是由冒号分隔的 6 个数字。字符串列表按第一个数字从大到小排序,然后依次按第二个、第三个等。下面的示例片段:

UniqueTierHash = [ '6:3:5:6.5:5:2.5',
                   '6:3:5:5.5:5:3.5',
                   '6:2.5:5:5:4:3',
                   '6:2.5:5.5:5.5:4.5:3.5',
                   '5.5:4.5:4.5:4.5:5.5:4.5' ]

我正在尝试获取此列表并将一个项目与下一个保留案例进行比较,其中 6 个数字中的每一个都大于或等于下一个项目。最初,我编写了一个执行此操作的函数,但它最终返回了所有字符串。这是因为随后会将较小的字符串与下一个字符串进行比较,并且由于不同,两者都将被保留。

TierHashKeep = []

for i in UniqueTierHash:

    if UniqueTierHash.index(i) == len(UniqueTierHash) - 1: break

    test = function.CompareTierHash(i,UniqueTierHash[UniqueTierHash.index(i) + 1])
    print(i + ' \n' + UniqueTierHash[UniqueTierHash.index(i) + 1])
    print(test)

    if test == False:
        TierHashKeep.append(i)
        TierHashKeep.append(UniqueTierHash[UniqueTierHash.index(i) + 1])
    elif test == True:
        TierHashKeep.append(i)
    else:
        print('Error in TierCompare')

我怀疑我需要对 UniqueTierHash 进行某种递归评估,并在遍历列表时删除项目。任何有关如何最好地解决此问题的建议将不胜感激。谢谢。

标签: python

解决方案


处理此类数据的一个好方法是将其放入 NumPy 数组中。进行过滤的一种方法是仅使用完整数组的第一行初始化一个列表,然后遍历整个数组的其他行,将每一行与新列表的最后一个元素进行比较,并将其添加到如果其所有元素都较小,则为新列表:

import numpy as np

list_of_strings = ['6:3:5:6.5:5:2.5', # data slightly changed for testing
                   '6:3:5:5.5:5:3.5',
                   '6:2.5:5:5:4:2',
                   '6:2.5:5.5:5.5:4.5:3.5',
                   '5.5:1:1:1:1:0.5']

numbers = np.array([s.split(':') for s in list_of_strings], 
                   dtype=float)

numbers_descending = [numbers[0]]

for row in numbers[1:]:
    if all(row <= numbers_descending[-1]):
        numbers_descending.append(row)

numbers_descending = np.array(numbers_descending)

numbers_descending
array([[6. , 3. , 5. , 6.5, 5. , 2.5],
       [6. , 2.5, 5. , 5. , 4. , 2. ],
       [5.5, 1. , 1. , 1. , 1. , 0.5]])

推荐阅读