Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 递归地比较列表中的项_Python - Fatal编程技术网

Python 递归地比较列表中的项

Python 递归地比较列表中的项,python,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',

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

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

将numpy导入为np
list_of_strings=['6:3:5:6.5:5:2.5',#测试数据略有变化
'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(“:”)表示字符串列表中的s],
数据类型=浮点)
数字\u递减=[数字[0]]
对于数字[1:]中的行:

如果all(row您在这里让自己的生活变得艰难;如果您想要定期访问元素的索引,您应该使用类似
的内容来迭代列表,例如索引,枚举中的哈希(UniqueTierHash)
,但在本例中,我认为您并不真正需要索引;您只需要访问两个相邻的元素,这样您就可以获取第一个元素,然后在剩余的列表上迭代,保留“上一个”另一种方法是迭代索引,每次通过循环直接获取元素

我在这里只保留了通过测试的实际值;您似乎保留了所有值和一些值两次

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=[]
此_hash=UniqueTierHash[0]#开始配对的第一个元素
对于UniqueTierHash[1:]中的下一个_散列:#遍历列表的其余部分
test=function.CompareTierHash(此\u散列,下一个\u散列)
打印(此散列+'\n'+下一个散列)检查#
打印(测试)检查#
如果test==True:
TierHashKeep.append(此\u散列)
elif测试!=错误:
打印(“TierCompare中的错误”)
此散列=下一个散列#前滚到下一对
打印(TierHashKeep)检查#

+1.我个人建议做的唯一不同的事情是将
替换为范围内的I(1,len(数字)):
类似于
for number in numbers:
。Python的for循环功能非常强大,通常是按预期使用它们,而不是强制它们像其他语言的基于索引的for循环一样。谢谢@CrazyChucky,这是一个很好的观点。我相应地编辑了答案。我花了一点时间才弄明白(Python新手),但我明白了。回顾“保存的数组”(数字从大到小)比在同一个数组中向前看更有意义。我保持了只拆分两个字符串而不是整个字符串的方法,因为我预期会有几个非常大的数组,并且我正在尝试最小化开销。我非常喜欢'all()'方法,比我函数中的little for循环要好得多。关键是'数字降序[-1])部分。我不知道你能做到这一点。非常酷。谢谢。我是Python新手,所以我花了一点时间来理解你建议的语法和方法。为了澄清,我目前正在使用'.split()'用于实际比较。它位于CompareTierHash中(正常工作)。for循环所做的只是将当前项和下一项传递给compare函数,该函数只返回一个布尔值。谢谢。更新以解释和澄清,并保留您的测试调用。是的,您是正确的。我无意中保留了所有值,有些值保留了两次,这是因为我是如何与一些不幸的人进行比较的e逻辑。我现在回顾上一个keep数组,因为我正在使用唯一数组进行比较。现在,它按预期运行。谢谢。
array([[6. , 3. , 5. , 6.5, 5. , 2.5],
       [6. , 2.5, 5. , 5. , 4. , 2. ],
       [5.5, 1. , 1. , 1. , 1. , 0.5]])