【问题标题】:How to sort a list, only sorting strings?如何对列表进行排序,只对字符串进行排序?
【发布时间】:2017-06-21 20:31:11
【问题描述】:

我有一个字符串和整数列表,想对列表进行排序,保留这样的数字

["Hello", 1, 2, "World", 6, "Foo", 3]

会变成

["Foo", 1, 2, "Hello", 6, "World", 3]

简而言之,它只对列表中的字符串进行排序,而不是对保留在原地的整数进行排序。我尝试将key 参数与list.sort() 一起使用,但没有达到我想要的效果。

谁能帮我解决这个问题?

编辑:这与链接问题不同,因为我想保留整数的索引,而不是将它们与字符串一起排序。

编辑:这与第二个链接问题不同,因为该问题的答案可以使用 key 参数解决问题,我已经明确指出在这种情况下不起作用。

【问题讨论】:

标签: python list sorting


【解决方案1】:

前几天从@JonClements 那里学到了这个很酷的技巧。

这里是:

gen = iter(sorted([x for x in lst if isinstance(x, str)]))
new_lst =  [next(gen) if isinstance(x, str) else x for x in lst]
print(new_lst)
# ['Foo', 1, 2, 'Hello', 6, 'World', 3]

分别对字符串进行排序,并从排序后的字符串创建生成器表达式。在列表推导中,从 gen 中交替选择对象。 exp。如果只有原始位置的项目是字符串,则使用三元条件,否则,从初始列表中选择一个项目(整数)。

【讨论】:

  • 我实际上赞成这个解决方案。但是我知道投票者的投票完全基于您的解决方案是 O(n^2) 并且使原始数组的内存占用加倍这一事实。
  • @MosesKoledoye 我看过一个模拟问答,有奇数和偶数。是同一个吗?
  • @Jean-FrançoisFabre 是的,那个。
  • 如果存在惰性排序算法,这可以变得更漂亮的唯一方法。
  • @MosesKoledoye 可以通过在sort:gen = iter(sorted([x for x in l if isinstance(x,str)])) 中强制列表理解来稍微快一些,因为无论如何它都需要构建它。 (顺便说一句,我们在这个网站上花费了太多时间)
【解决方案2】:

首先,像这样对异构列表进行排序仅在 Python 2 中有效。但结果并不是您所需要的。

我将在过滤列表的排序版本上创建一个迭代器(仅保留字符串),并根据元素类型使用此迭代器的一项或原始列表重建列表:

l = ["Hello", 1, 2, "World", 6, "Foo", 3]

sgen = iter(sorted([x for x in l if isinstance(x,str)]))

result = [next(sgen) if isinstance(x,str) else x for x in l]

print(result)

结果:

['Foo', 1, 2, 'Hello', 6, 'World', 3]

【讨论】:

    【解决方案3】:

    首先在提取数组时仅使用字符串对数组进行排序,然后在原始数组中逐步替换字符串:

    l = ["Foo", 1, 2, "Hello", 6, "World", 3]
    
    s = [x for x in l if type(x) == str]
    s.sort()
    
    j = 0
    for i, x in enumerate(l):
        if type(x) == str:
           l[i] = s[j]
           j += 1
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    猜你喜欢
    • 2015-03-26
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多