首页 > 解决方案 > 如何在这里正确使用列表?

问题描述

我的问题如下:我想创建一个l从列表中接受随机列表 ( ) 的程序。这个随机选择的列表又包含其他列表。然后它应该在里面找到最短的列表,l并将里面的所有其他列表剪掉最短列表l的长度。这些列表应附加到新列表 ( l_exit) 中,如下所示:[ l[1][1], l[2][1], ... , l[i][1], l[1][2], ... , l[i][k]]。然后将所有已剪切的元素添加到l_exit.

输入[[1,2,3],['a', 'b'], [30, 40, 50, 60]]

输出[1, 'a', 30, 2, 'b', 40], [3, 50, 60]

(最短的长度是 2 ( ['a','b'])。我们将每个列表减 2,因此有新的后续列表[1,2],['a','b'],[30,40]。它们相应地添加到l_exit[0](首先进入每个列表的第一个元素,其次是第二个,依此类推)。最后我们添加一个新的已离开的项目列表,已从预先存在的列表中删除3,50,60:)

当我尝试使用上述输入运行程序时,我有以下输出:

changed l: [[1, 2, 3], ['a', 'b'], [30, 40, 50, 60]]
l_exit: [[40, 'b', 2, 30, 'a', 1, 1],[]]

问题的根源是什么?我将不胜感激任何帮助!提前致谢!

该程序:

import random
l_1 = [[1,2,3],['a', 'b'], [30, 40, 50, 60]] 
l_2 = [[1,2,3,4,5],['a', 'b','c'], [30, 40, 50, 120]] 
l_3 = [[1],['a', 'b'], [30, 40, 50, 60, 101, 120]] 
l_rand = [l_1,l_2,l_3]
l = random.choice(l_rand)
l_exit = [[],[]]

if (len(l[1]) < len(l[2])):
  index = len(l[1])
else:
  index = len(l[2])

for i in range (len(l)):
  if (len(l[i]) < index):
    l_exit[1] = l[i][index:]
    l[i] = l[i][:index]

for i in range (index):
  for k in range(len(l)):
    l_exit.insert(0,(l[k][i]))

print('changed l:', l)

print('l_exit: ', l_exit)

标签: pythonlist

解决方案


定义index

首先,以下if/else树中存在问题:

if (len(l[1]) < len(l[2])):
  index = len(l[1])
else:
  index = len(l[2])

l[0]在最短list的情况下会发生什么l?或者最长list的情况l有一个索引>2

如果index要定义为“表示存储在len其中的最短的整数”,那么我建议如下:listl

index = len(sorted(l, key=len)[0])

代码非常简洁,基本上运行为“的值indexlen第一个存储在已排序list的副本中的值”。这将停止可能由您的原始定义产生的意外/不良行为,如上所述。llenindex

填充l_exit

据我了解,l_exit应该是一个list包含:

  1. Alist包含所有值(但不包括索引 from 0index来自每个list内部的索引l- 存储在l_exit[0]
  2. Alist包含index来自每个list内部的索引中的所有值l- 存储在l_exit[1]

首先,您尝试l_exit[1]使用以下循环进行填充:

for i in range (len(l)):
  if (len(l[i]) < index):
    l_exit[1] = l[i][index:]
    l[i] = l[i][:index]

这里的问题是 givenindex指的是len顶层元素中最短的值list l(如前所述,这在当前实现中可能不可靠,但在您提供的示例输出中),代码保存在if len(l[i]) < index):块中将永远不会执行 - 因为根据定义 nolen(l[i]) for i in l可能是< index.

结论

我不会在这里详细讨论您的代码中的问题,因为我觉得很明显您应该花一些时间查看每个语句/结构,使用调试器或控制台打印输出进行调试以最适合您的态度 - 您能否说明每个语句/结构如果被问到,你的代码行在做什么?

但是,我建议您查看内置enumerate()方法 -enumerate文档- 因为我觉得您可以使用它来提高代码的可读性/可维护性。

解决方案

我认为花时间自己检查现有代码是很值得的,但值得一提的是我对所提出问题的完整解决方案。

import random
l_1 = [[1,2,3],['a', 'b'], [30, 40, 50, 60]] 
l_2 = [[1,2,3,4,5],['a', 'b','c'], [30, 40, 50, 120]] 
l_3 = [[1],['a', 'b'], [30, 40, 50, 60, 101, 120]] 
l_rand = [l_1,l_2,l_3]
l = random.choice(l_rand)

index = len(sorted(l, key=len)[0])

l_exit = [[j for i in l for j in i[:index]], [y for x in l for y in x[index:]]]

print(f'l: {l}')
print(f'l_exit: {l_exit}')

测试输出

l: [[1, 2, 3], ['a', 'b'], [30, 40, 50, 60]]
l_exit: [[1, 2, 'a', 'b', 30, 40], [3, 50, 60]]

推荐阅读