【问题标题】:Sorting strings with integer values in python在python中对具有整数值的字符串进行排序
【发布时间】:2013-07-15 04:25:34
【问题描述】:

我有一些代码我觉得很笨拙。

给定:

sample_lists = [(u'1', u'penguin'), (u'2', u'kelp'), (u'5', u'egg')], 
               [(u'3', u'otter'), (u'4', u'clam')]

我想要结果:['penguin', 'kelp', 'otter', 'clam', 'egg'](按数字排序)。您可以假设列表始终包含'1',并且每个子列表按升序排列,并且sample_lists 中的所有数字都是连续整数,如果有帮助的话。

目前,我能想到的最 Pythonic/简洁的方式是:

sample_list = sample_lists[0]+sample_lists[1]
for i in xrange(len(sample_list)):
    sample_list[0] = i+1
return zip(*sorted(sample_list, key=operator.itemgetter(0)))[1]

有没有更好的方法?我觉得这很笨拙。这里的问题是按字符串排序,我需要将其一一转换为整数。预感会是一些 lambda 函数,但我并不十分精通这种语法。如果这是最好的方法,我仍然很好奇如何使用 lambda 函数来做到这一点,如果可能的话。

注意直接字符串比较单行:

print zip(*sorted(sample_lists[0]+sample_lists[1], key=operator.itemgetter(0)))[1]

不起作用,因为如果 sample_lists 包含“11”或“20”,它就会失败。

python 3 的答案还可以,但首选 python 2.7。

【问题讨论】:

    标签: python arrays sorting functional-programming string-comparison


    【解决方案1】:

    itemgetter 很酷,但不允许您转换为 int。在这种情况下,lambda 函数会更好,因为它可以让您同时进行 itemgetting 和 int 转换

    >>> from itertools import chain
    >>> [x[1] for x in sorted(chain.from_iterable(sample_lists), key=lambda x:int(x[0]))]
    [u'penguin', u'kelp', u'otter', u'clam', u'egg']
    

    【讨论】:

    • 相比于 sample_lists[0]+sample_lists[1],使用 chain.from_iterable 有什么优势?
    • @JDong,如果 sample_lists 有两个以上的元素怎么办?
    【解决方案2】:

    Nice answer,吃货!我认为唯一缺少的是从 sample_lists 到您的 sample_list 的转换,可以这样完成:

    sample_list = [item for lst in sample_lists for item in lst]

    【讨论】:

    • 是的,我错过了。您也可以使用chain.from_iterable 并在sort 中执行此操作
    • @gnibbler:没错,这可能会更有效率,但我对chain 还不是很熟悉;-)
    猜你喜欢
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2016-09-13
    • 1970-01-01
    相关资源
    最近更新 更多