【问题标题】:Python: Last index is not being iteratedPython:最后一个索引没有被迭代
【发布时间】:2020-10-09 03:41:26
【问题描述】:

我正在解决一个问题,我得到一个重复数字列表,我必须从初始列表中返回一个包含所有唯一值的新列表。

这是我的解决方案:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
updated_lst = []
for i in range(0,len(new_list)-1):
    if new_list[i] != new_list[i+1]:
        updated_lst.append(new_list[i])
print(updated_lst)

输出:[1, 2, 3, 4] 但它​​缺少 new_list 中的 5。

另外,我是 python 新手,知道我可以做类似的事情

updated_list = []
for i in new_list:
   if i not in updated_list[]:
       updated_list.append(i)

但我想知道如何使我的初始解决方案发挥作用。

非常感谢

【问题讨论】:

  • 如果最后一项不等于倒数第二项,我将在 for 循环之后添加一个检查,如果是,则附加它。最后一项只是一种特殊情况,不能像其他情况一样处理。
  • 您的清单是否保证井然有序?因为如果数字乱序,您的算法将无法正常工作(考虑[1, 2, 1])。对于您正在使用的算法,您应该始终在输入列表中包含最后一项。

标签: python list function loops iteration


【解决方案1】:

您的问题是 range(N, M) 内置函数将从 N 迭代到 M - 1,因此您不应将第二个参数设置为 len(new_list)-1 而是设置为 len(new_list)

参见参考here

这不会使您的第一个解决方案起作用,但可以解释为什么您没有得到最后一个项目。

表示此解决方案不是最佳的,通过手动查看索引来实现它的方法是:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
updated_lst = []

for i in range(0,len(new_list)):
    found = False

    for j in range(0, len(updated_lst)):
        if new_list[i] == updated_lst[j]:
            found = True
            break

    if not found:
        updated_lst.append(new_list[i])

print(updated_lst)

这对学习很有好处,但我会避免在操场之外使用它,因为它不必要地复杂和不雅。

感谢 @ncasale 帮助改进答案。

附带说明,您的第一个算法不会删除重复项,而只会删除重复项。实现您想要的另一种方法可能是list(set(new_list))

【讨论】:

  • 迭代到len(new_list)会在调用if new_list[i] != new_list[i+1]:时抛出异常。
  • 确实,但这是一个错误的算法,不会删除重复项。
【解决方案2】:

我建议W3schools: 对于这个问题,但在你的具体情况下,我会这样做:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
new_list = list(dict.fromkeys(new_list))
print(new_list)

输出:“[1, 2, 3, 4, 5]”

希望这有帮助

【讨论】:

  • 我认为在这种情况下 set() 而不是 dist 会更合适
  • 是的,但无论哪种方式,它都可以回答问题并且占用的代码行数少于尝试的代码。
  • @Edo98 注意,list(set(new_list)) 不维持秩序
【解决方案3】:

我不确定您的问题是否需要您遍历列表,但您可以通过将列表转换为set 轻松找到列表中的所有唯一元素。然后,您可以通过将 set 转换回 list 来获得 list

new_list = [1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5]
unique = set(new_list)
print(list(unique))

返回:

[1, 2, 3, 4, 5]

【讨论】:

  • 不保证打印列表的顺序。如果重要,“列表”应替换为“排序”。
  • 同意。提问者没有指定顺序,但如果需要顺序,那么sorted当然可以使用。
  • 好吧,sorted 并不完全正确,因为sorted 将返回排序列表,而不是原始顺序中的项目列表,该列表由使用集合。在现代 python 中,dict 对象可以保证保持顺序,所以如果你想要一些可爱的东西,list(dict.fromkeys(new_list)) 就可以工作。
【解决方案4】:

Set 是一种无重复元素的无序集合数据类型。 对于所需的输出,我们可以将给定的列表转换为一个集合,这将删除所有重复的元素。然后我们可以再次将其转换为列表。如下:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
x=set(new_list)
print(list(x))

这会将输出打印为:

[1, 2, 3, 4, 5]

这样我们得到的列表没有任何重复的元素。 希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2013-02-20
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多