【问题标题】:How do I sort this array in Python?如何在 Python 中对这个数组进行排序?
【发布时间】:2018-08-08 11:32:44
【问题描述】:

我有这个数组:

[14, 'S', 12, 'D', 8, 'S', 9, 'S', 10, 'D']

我想按降序(数字)对其进行排序,但同时将数字与以下字母保持在一起。所以结果应该是这样的:

[14, 'S', 12, 'D', 10, 'D', 9, 'S', 8, 'S']

我该怎么做?

我尝试过这样做(five_cards_num 是数组的名称):

for j in range(4):
    max = five_cards_num[j]
    max_color = five_cards_num[j+1]
    for i in range(j, 5):
        if (five_cards_num[2*i] > max):
            max = five_cards_num[2*i]
            max_color = five_cards_num[2*i+1]
            five_cards_num[2*i] = five_cards_num[j]
            five_cards_num[2*i+1] = five_cards_num[j+1]
            five_cards_num[j] = max
            five_cards_num[j+1] = max_color

但我得到错误:

TypeError: '>' 在 'int' 和 'str' 的实例之间不支持

提前谢谢你。

【问题讨论】:

    标签: python arrays list sorting


    【解决方案1】:

    我更喜欢这个简单的解决方案:

    list(sum(sorted(zip(x[::2], x[1::2]), reverse=True), ()))
    

    输出

    [14, 'S', 12, 'D', 10, 'D', 9, 'S', 8, 'S']
    

    【讨论】:

    • 不错的一个班轮 :) @Lev
    • @KostadinSlavov 谢谢:)
    【解决方案2】:

    您可以使用zip 将列表转换为元组列表,以便您可以将这些对排序在一起,然后使用嵌套列表推导将其展平:

    print([a for i in sorted(zip(five_cards_num[::2], five_cards_num[1::2]), reverse=True) for a in i])
    

    这个输出:

    [14, 'S', 12, 'D', 10, 'D', 9, 'S', 8, 'S']
    

    【讨论】:

    • 完美运行,谢谢!你能否给我更多解释一下“a for i in”和“for a in i”的作用?我以前从未见过这样使用“for”。
    • 很高兴能提供帮助。详情可参考nested list comprehension
    【解决方案3】:

    再次使用itertools 的另一种方法。

    >>> import itertools as it
    >>> a = [14, 'S', 12, 'D', 8, 'S', 9, 'S', 10, 'D']
    >>> b = sorted(it.izip(*[iter(a)]*2), reverse=True)
    >>> b
    [(14, 'S'), (12, 'D'), (10, 'D'), (9, 'S'), (8, 'S')] # you may want to play with a list of tuples (?|!)
    >>> list(it.chain(*b))
    [14, 'S', 12, 'D', 10, 'D', 9, 'S', 8, 'S']
    

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      相关资源
      最近更新 更多