【问题标题】:How to pass an element in list as an index to a list in python?如何将列表中的元素作为索引传递给python中的列表?
【发布时间】:2019-12-22 05:19:02
【问题描述】:

给定一个排序列表 [1,2,3,4,5,6,7,8] 和该列表的随机版本

a=[1,2,5,3,7,8,6,4]

我想找出每个元素从其相对于排序列表的位置移动了多少步(朝向索引 0 的步数为正数,远离索引 0 的步数为负数)并将这些步长值存储在不同的索引中列表。

对于给定的输入,预期的输出是:

b=[0,0,-1,-4,2,-1,2,2]

考虑值3(在排序列表中位于索引2),在混洗数组中它位于索引3,所以它采取了-1步,因此b[2] = -1。类似地,对于值8(在排序列表中位于索引 7 处),在混洗后的数组中,它位于索引 5 处,因此它采取了 +2 步,因此是 b[7] = 2

这是我尝试过的:

b=[0,0,0,0,0,0,0,0]
a=[1,2,5,3,7,8,6,4]
for x in range(len(a)):
   b[a[x]]=a[x]-(x+1)

我收到此代码的错误:

IndexError: 列表赋值索引超出范围

请帮助我理解这一点。为什么我不能将列表中的整数作为索引传递给另一个列表?

【问题讨论】:

  • 您如何确定b 不是很直观。你能解释一下你的过程吗?
  • @smac89,这里假设原始顺序是 [1,2,3,4,5,6,7,8] 并且在 a=[1,2,5,3,7, 8,6,4] 5 是第 3 位,所以它向前走了 2 步。 4 位于第 8 位,因此它移动了 -4 步。 1 和 2 保持相同的位置,所以 0,0.like 其他数字。 3 采取了-1 步。 6 采取了-1 步。 7 和 8 各走 2 步。
  • 这就是您的示例令人困惑的原因,因为它表明 5 需要后退 1 步,但实际上它应该前进 2 步
  • @smac89 希望它现在清楚.. 你能帮忙吗?
  • a 列表中的数字 8 不是b 列表中的有效索引。索引从 0 开始,而不是 1,因此b 中的第一个索引是 0,b 中的最后一个索引是 7,而不是 8。

标签: python-3.x list data-structures


【解决方案1】:

您可以通过将数组位置的预期值与a 数组中该值的索引进行简单比较来获得所需的结果。通过迭代a中的元素数量,我们可以生成输出数组:

a = [1,2,5,3,7,8,6,4]
b = []
for x in range(len(a)):
    b.append(x - a.index(x+1))
print(b)

输出

[0, 0, -1, -4, 2, -1, 2, 2]

Demo on rextester

【讨论】:

    【解决方案2】:

    众所周知,问题是存在索引错误。

    a=[1,2,5,3,7,8,6,4]
    

    上述数组的大小为 8。

    现在你创建b:

    b=[0,0,0,0,0,0,0,0]
    

    列表b的大小也是8。

    在你的 for 循环中你正在做:

    b[a[x]]
    

    暂停...

    如果x是5,那么a[x]就是8。但是,列表b中没有索引8这样的东西,最多只有索引7。

    这就是问题所在。

    您应该将 for 循环中的代码更改为:

    b[a[x] - 1]=a[x]-(x+1)
    

    我建议您将循环更改为:

    for x, n in enumerate(a):
       b[n-1] = n-(x+1)
    

    【讨论】:

    • @SreeHarshaKOLI 当您执行b[a[2]] = 10 时,您是否真的检查了b 中的哪个元素发生了变化?这应该会给你一个线索,为什么 b[8] 失败了
    • 是的,我明白了。感谢您的时间和耐心。这是我在 stackoverflow 上的第一篇文章。那意义重大。 :)
    • @SreeHarshaKOLI 欢迎您。如果这回答了您的问题,请将其标记为已接受。祝你有美好的一天
    • 枚举可以从1开始计数
    【解决方案3】:

    索引从 0 到 n-1 ,所以在 b=[0,0,0,0,0,0,0,0](有 8 个元素)中,索引将从 0 到 7 开始并列出 'a=[1,2 ,5,3,7,8,6,4]' 包含 1-8 的数字,因此 8 超出索引。

    更正的代码:

    b=[0,0,0,0,0,0,0,0]
    a=[1,2,5,3,7,8,6,4]
    for x in range(len(a)):
       b[a[x] - 1]=a[x]-(x + 1)
    

    【讨论】:

      【解决方案4】:

      避免任何索引,也避免不必要的偏移,我们可以将元素存储在字典中(元素作为键,移动作为值)

      a=[1,2,5,3,7,8,6,4]
      
      d = {v: v-e for e,v in enumerate(a, 1)}
      b = [v for _, v in sorted(d.items())]
      print(b)
      

      产生

      [0, 0, -1, -4, 2, -1, 2, 2]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-15
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        相关资源
        最近更新 更多