【问题标题】:Comparing lists which have the same elements, are in the same order?比较具有相同元素的列表是否具有相同的顺序?
【发布时间】:2014-02-17 06:01:05
【问题描述】:
def sorting(a, b, c):
    array = [a, b, c]
    newarray = array.sort()
    newarray2 = array.reverse()
    if newarray == array:
        print ('The fish is rising')
    elif newarray2 == array:
        print ('The fish is decesnding')
    else:
        print ('No fish')


def main():
    sorting((int(input('1st'))), (int(input('2nd'))), (int(input('3rd'))))

main()

基本上,如果输入的数字在增加,则鱼在上升,如果数字在减少,则鱼在减少。最后,如果输入的数字不是连续增加或减少,即 1、3、2,那么它应该不输出鱼。即使可能存在另一种更有效的方法,有人可以解释如何比较两个相同的列表以查看它们是否处于相同的顺序?

【问题讨论】:

  • 给定两个列表...查看它们的顺序是否相同,只需同时遍历两个列表,并检查所有相同索引处的元素是否不同索引。如果有任何差异,即使有差异,那么列表的顺序也会不同

标签: python list reverse


【解决方案1】:

当您使用.sort.reverse 函数时,它们会就地排序/反转数据并返回None。因此,您将None 分配给newarraynewarray2。然后在条件中,您正在检查None == None 是否始终为True。这就是您的代码无法正常工作的原因。

我能想到的直截了当的通用方式,是这样的

def sorting(*args):
    sorted_list, args = sorted(args), list(args)
    if sorted_list == args:
        print "Rising"
    elif sorted_list[::-1] == args:
        print "Descending"
    else:
        print "No Fish"

sorting(1, 2, 3, 4)        # Rising
sorting(5, 4, 3, 2, 1)     # Descending
sorting(2, 1, 3, 6, 4, 5)  # No Fish

【讨论】:

  • 我理解你的代码,它显然可以工作,但是除了使用 sorted 而不是我被引导理解的 sort 来实现相同的目标之外,为什么我的代码不能工作?
  • @user1814771 list.sortlist.reverse 就地更改列表并返回 None,因此您正在比较 None == None
  • @AshwiniChaudhary 感谢您向 OP 解释:) 我的回答中也包含了相同的解释。
  • 是的,你们俩都帮了大忙!我将它们更改为 sort 和 ::-1 我开始意识到这与拼接有关,所以我明天将不得不学习。感谢您的帮助!
  • @user1814771 是的,它被称为slicing。如果对您有帮助,请考虑accepting this answer
【解决方案2】:

为什么您的 sn-p 不起作用:

**list.sort:**

>>> help(list.sort)
Help on method_descriptor:

sort(...)
   L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
   cmp(x, y) -> -1, 0, 1
>>>

排序后它什么也不返回,也就是说你的 newarray 或 newarray2 什么都没有

示例:

>>> nar = [3,2,1]
>>> array = nar.sort()
>>> array
>>> nar
[1, 2, 3]
>>>

所以,请使用 sorted() 内置函数。

【讨论】:

    【解决方案3】:

    使用 numpy 数组更容易做到这一点...

    import numpy as np
    def abc(*args):
        xx = np.array(args)
        if    all(xx[1:] > xx[:-1]): print 'Increasing order'
        elif  all(xx[1:] < xx[:-1]): print 'Decreasing order'
        else:                        print 'Rando order'
    

    【讨论】:

    • 不起作用 - 尝试abc((1, 2), (2, 1), (3, 0))。此外,为此引入一个 numpy 依赖项是矫枉过正的。
    • 在 [23] 中:def abc(*args): ....: xx = array(args) ....: print xx[1:] > xx[:-1] 。 ...:在 [24] 中:abc(1,2,3,4,5) [真真真真]
    • 它在我的电脑上运行良好。我认为这个想法是将其用作:abc(1,2,3,4,5),如发布的问题:def sort(a,b,c):
    • (1, 2) 小于 (2, 1),后者小于 (3, 0),但您的代码会针对这种情况生成 ValueError
    • 您不应该比较原始问题中的元组。最初的问题是,给定函数def sorting(a,b,d) 中的3 个数字,我们将如何检查输入是a&gt;b&gt;c 还是a&lt;b&lt;c,或者前两个条件都不是。为什么你现在有元组作为输入???
    【解决方案4】:

    如果您不想对列表进行排序,可以使用以下 sn-p:

    for i,j in zip(*(a,b)):
        if i == j:
            continue
        else:
            print 'lists are not equal'
            break
    

    这基本上是在执行 Josh 提出的建议。

    快速演示:

    In [7]: for i,j in zip(*(a,b)):
       ...:     print i,j
       ...:     if i==j:
       ...:         continue
       ...:     else:
       ...:         print 'lists not equal'
       ...:         break
       ...:     
    a a
    b b
    c c
    
    In [8]: a='abd'
    
    In [9]: for i,j in zip(*(a,b)):
        print i,j
        if i==j:
            continue
        else:
            print 'lists not equal'
            break
       ...:     
    a a
    b b
    d c
    lists not equal
    

    【讨论】:

    • 为什么要经历所有这些而不是a != b
    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 2021-06-25
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多