【问题标题】:Sorting list of integers by individual integer values按单个整数值对整数列表进行排序
【发布时间】:2015-02-10 00:24:40
【问题描述】:

我正在尝试对随机整数值列表进行排序,如下所示:aList = [2241, 350] 从每个单独整数中的最后一个元素开始(将整数转换为字符串后)241,以及350 并像这样排序到空列表中:

zeros = [350]
ones = [2241]
twos = []
threes = []
fours = []
fives = []
sixes = []
sevens = []
eights = []
nines = []

然后返回一个组合列表,如下所示:aList = [350, 2241] 并再次对其进行迭代以查看整数中的下一个值并重复该过程,直到列表从最小到最大整数排序。

这是我目前的代码:

zeros, ones, twos, threes, fours, fives, sixes, sevens, eights, nines = [], [], [], [], [], [], [], [], [], []
for x in range(-1, 0) :
    for val in aList :
        val = str(val)
        if val[x] == 0 :
            zeros.append(val)
        elif val[x] == 1 :
            ones.append(val)
        elif val[x] == 2 :
            twos.append(val)
        elif val[x] == 3 :
            threes.append(val)
        elif val[x] == 4 :
            fours.append(val)
        elif val[x] == 5 :
            fives.append(val)
        elif val[x] == 6 :
            sixes.append(val)
        elif val[x] == 7 :
            sevens.append(val)
        elif val[x] == 8 :
            eights.append(val)
        elif val[x] == 9 :
            nines.append(val)
    aList = zeros + ones + twos + threes + fours + fives + sixes + sevens + eights + nines
    del zeros[:], ones[:], twos[:], threes[:], fours[:], fives[:], sixes[:], sevens[:], eights[:], nines[:]
    return aList

返回一个空列表。任何帮助表示赞赏,谢谢。

【问题讨论】:

    标签: python list sorting integer


    【解决方案1】:

    您要解决的更高级别的问题是“按数字列表的以 10 为底的表示形式的反转文本对数字列表进行排序”。所以这个:

    [2241, 350, 4, 53, 102]
    

    变成这样:

    [350, 2241, 102, 53, 4]
    

    您不需要先按最后一位数字排序,然后按倒数第二个数字排序的迭代方法,依此类推。相反,您可以使用 Python 的内置 sorted() 函数一次性完成所有操作,该函数接受一个序列 (aList) 和一个 key 函数,并返回一个新的 list,根据返回的值排序key 函数。这是所需的全部代码:

    aList = [2241, 350, 4, 53, 102]
    
    def mySortKey(number):
        return str(number)[::-1]
    
    print sorted(aList, key=mySortKey)
    

    为了编写我们的key,我们将数字转换为字符串,然后反转文本。所以第一个数字变成'1422'。有关我们为何使用 [::-1] 进行反转的更多信息,请参阅:Reverse a string in Python

    【讨论】:

    • 哦,后面的阅读方式......我以为他只是想把它们装箱(+1)
    【解决方案2】:
    from collections import defaultdict
    d = defaultdict(list)
    for val in vals:
        d[val%10].append(val)
    
    print d
    

    可能会做你想做的事(尽管仔细检查我相信你想要@JohnZwinck的解决方案)

    【讨论】:

    • 我其实觉得你的答案比约翰·兹温克更正确
    【解决方案3】:

    鉴于此列表:

    aList = [2241, 350, 255, 12, 50]
    

    您可以使用字典来捕获相关的结尾字符:

    results = {str(n):list() for n in range(10)}
    for x in aList:
        results[str(x)[-1]].append(x)
    >>> results
    {'1': [2241], '0': [350, 50], '3': [], '2': [12], '5': [255], '4': [], '7': [], '6': [], '9': [], '8': []}
    

    然后您可以使用列表推导将其放入列表列表中:

    rl=[results[str(x)] for x in range(10)]
    >>> rl
    [[350, 50], [2241], [12], [], [], [255], [], [], [], []]
    

    如果您真的希望命名变量具有列表的值,则可以使用元组解包:

    zeros, ones, twos, threes, fours, fives, sixes, sevens, eights, nines=rl
    

    但我认为最后一步是因为您还不了解字典或列表列表;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2013-01-26
      • 2018-05-29
      • 1970-01-01
      • 2021-02-03
      • 2012-11-29
      • 2021-06-06
      相关资源
      最近更新 更多