递归地比较列表中的项

2024-04-19 16:47:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经生成了一个唯一的字符串列表。每个字符串是由冒号分隔的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进行某种递归计算,并在遍历列表时删除项。任何关于如何最好地解决这一问题的建议都将不胜感激。谢谢


Tags: 项目字符串intest示例列表indexif
2条回答

处理此类数据的一个好方法是将其放入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]])

你让这里的生活变得很艰难;如果您希望定期访问元素的索引,那么应该使用类似for index, hash in enumerate(UniqueTierHash)的内容迭代列表,但在这种情况下,我认为您并不真正需要索引;您只需要访问两个相邻的元素,这样就可以获取第一个元素,然后遍历剩余的列表,每次都保留“previous”值。另一种方法是迭代索引,每次通过循环直接获取元素

我只保留了通过您测试的实际值;你似乎保留了所有的价值观,有些价值观保留了两次

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' ]

TierHashKeep = []

this_hash = UniqueTierHash[0] # first element to start the pairing

for next_hash in UniqueTierHash[1:]: # iterate through rest of list

    test = function.CompareTierHash(this_hash, next_hash)

    print(this_hash + ' \n' + next_hash) ####### check #
    print(test) ####### check #

    if test == True:
        TierHashKeep.append(this_hash)
    elif test != False:
        print('Error in TierCompare')

    this_hash = next_hash # roll forward to the next pair

print(TierHashKeep) ####### check #

相关问题 更多 >