【问题标题】:Sorting from Tuple - Index out of Range从元组排序 - 索引超出范围
【发布时间】:2013-10-12 19:25:24
【问题描述】:
def mkEntry(file1):
    for line in file1:
        lst = (line.rstrip().split(","))
        print("Old", lst)
        print(type(lst))
        lst = tuple(lst)
        print(type(lst)) #still showing type='list'
        print("Old2", lst)
    sorted(lst, key=operator.itemgetter(1,2))


def main():
    openFile = 'yob' + input("Enter the year <Do NOT include 'yob' or .'txt' : ") + '.txt'
    file1 = open(openFile)
    mkEntry(file1)

main()

我收到的错误:

Traceback (most recent call last):
  File "/Users/ranbir/Desktop/names/top101.py", line 20, in <module>
    main()
  File "/Users/ranbir/Desktop/names/top101.py", line 18, in main
    mkEntry(file1)
  File "/Users/ranbir/Desktop/names/top101.py", line 12, in mkEntry
    sorted(lst, key=operator.itemgetter(1,2))
IndexError: string index out of range

文件:

Tom,M,1658
Anthony,M,985
Lisa,F,88976
Ben,M,6989
Shelly,F,8975

我需要帮助将顺序从F 排序到M,然后从最小数字到最大数字。输出应如下所示:

Shelly,F,8975
Lisa,F,8976
Ben,M,698
Anthony,M,985
Tom,M,1658

所以基本上,女性首先是最小到最大的数字,然后是男性,然后是最小到最大的数字(M=malef=female)。

【问题讨论】:

  • lst 只是 一个 行;一个元组。不是元组列表。您正在尝试对 ('Shelly', 'F', '8975') 进行排序。
  • 糟糕,它应该在 for 循环之外。我更新了。
  • Ben,M,6989 输入,Ben,M,698 输出?
  • 请注意,即使在 Objective-C 中,如果您在循环内设置一个变量,然后在循环之后和循环外使用该变量调用一个函数,您只会对循环的最后一个值进行操作.同样,如果您调用的函数没有就地执行并且不对返回值做任何事情,那么代码也不会按照您的预期进行。
  • 我忘了把'return'放进去。

标签: python sorting indexing


【解决方案1】:

你在循环中不断地重新分配lst

for line in file1:
    lst = (line.rstrip().split(","))
    lst = tuple(lst)

sorted(lst, key=operator.itemgetter(1,2))

您没有构建所有条目的最终列表。为此,您需要一个 单独的 列表对象:

results = []
for line in file1:
    lst = line.rstrip().split(",")
    lst = tuple(lst)
    results.append(lst)

return sorted(results, key=operator.itemgetter(1,2))

请注意,您也需要返回已排序的列表。

这仍然不会达到您的预期,因为您的最后一个元素(在索引 2 处)仍然是一个字符串。 '10' 将排序 before '91234' 因为字符串是按字典顺序排序的。改为数字:

results = []
for line in file1:
    lst = line.rstrip().split(",")
    lst[2] = int(lst[2])
    lst = tuple(lst)
    results.append(lst)

return sorted(results, key=operator.itemgetter(1,2))

【讨论】:

  • 在您的第三个代码中,它显示错误:lst[2] = float(lst[2]) IndexError: list index out of range
  • 糟糕,我的文本文件中有输入空间。有用。谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 2013-07-28
  • 2021-03-02
  • 2018-11-16
  • 2016-04-04
  • 2020-06-08
  • 2017-07-12
相关资源
最近更新 更多