【问题标题】:Python list is not getting sorted using the built-in sort funtionPython 列表未使用内置排序功能进行排序
【发布时间】:2014-11-03 12:32:24
【问题描述】:

我有一个名为“static_mac_dict”的字典,其中包含如下键值项:

'2273': {'Type': 'Static', 'Port': 'Eth1/4', 'Mac Address': '80:9B:4B:D2:C8:E1'}

我会根据键对字典进行排序,然后只打印它的值。

但是,我不能这样做,因为无法对字典进行排序。

因此,我决定

  • 将所有字典键复制到一个列表(命名为 keysList)。
  • 使用 Python 内置的 sort() 函数对列表进行排序。
  • 迭代排序的键列表,然后打印字典值。

keysList 看起来像这样:

['1294', '1518', '2230', '2273', '2844', '3642', '3971', '816']

现在是代码:

keysList = []
keysList = static_mac_dict.keys()

keysList.sort()
print (keysList)

for key in keysList:
    if key != None:
        print dictionary values...

但是,我注意到在上面的代码中,使用 sort() 函数后键列表没有排序。

排序功能确实可以正常工作,只有当我将键从 STR 转换为 INT 时,您可以在下面的代码中看到:

keysList = []
keysList = static_mac_dict.keys()

for i in range(len(keysList)):
    keysList[i] = int(keysList[i])

#sorting the list
keysList.sort()
print (keysList)

# converting the list items back to str
for i in range(len(keysList)):
    keysList[i] = str(keysList[i])

for key in keysList:
    if key != None:
        print dictionary values...

我的问题是:为什么我需要将列表项转换为 INT 才能使排序功能正常工作?

提前致谢。

【问题讨论】:

  • 字符串按字典顺序排序,例如"21" < "3"。参见例如stackoverflow.com/q/5967500/3001761
  • 你也可以通过for key in sorted(static_mac_dict.keys(), key=int): print static_mac_dict[key]来完全避免复制

标签: python list sorting python-2.7 dictionary


【解决方案1】:

sort 函数正在正常工作 - 只是不符合您的预期。它在它们的字符lexicographic order 中对字符串进行排序。

Python(或任何其他语言)不可能知道您真的想将字符串解释为数字 - 除非您告诉它(请参阅gnibbler 的回答)。

请注意,与大多数语言一样,python 中的排序完全取决于对象的type。大多数内置类型(例如intfloatstr,甚至tuplelist)都有明确定义的顺序。自定义类的实例没有(有意义的)顺序,而是you can define it if you want

【讨论】:

    【解决方案2】:

    如评论中所述:

    字符串按字典顺序排序,例如“21”

    希望能回答你的问题。

    现在,如果您想将字符串列表转换为整数列表,请查看以下问题:Convert all strings in a list to int

    Answer:

    results = ['1294', '1518', '2230', '2273', '2844', '3642', '3971', '816']
    results = map(int, results)
    

    【讨论】:

      【解决方案3】:

      由于键是字符串,它们将按字典顺序进行比较,而不是按照您的意愿进行数字比较。

      您可以使用int 作为key 函数对它们进行排序

      keysList.sort(key=int)
      

      这将为您节省转换为 int 并返回到 str 的显式步骤

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 2021-10-04
        • 1970-01-01
        • 1970-01-01
        • 2014-05-30
        • 2018-08-26
        • 2018-05-03
        • 2022-01-27
        • 1970-01-01
        相关资源
        最近更新 更多