python - 如何在这里正确使用列表?
问题描述
我的问题如下:我想创建一个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)
解决方案
定义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
其中的最短的整数”,那么我建议如下:list
l
index = len(sorted(l, key=len)[0])
代码非常简洁,基本上运行为“的值index
是len
第一个存储在已排序list
的副本中的值”。这将停止可能由您的原始定义产生的意外/不良行为,如上所述。l
len
index
填充l_exit
据我了解,l_exit
应该是一个list
包含:
- A
list
包含所有值(但不包括索引 from0
)index
来自每个list
内部的索引l
- 存储在l_exit[0]
- A
list
包含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]]
推荐阅读
- javascript - 当我们控制台 ([] +50) 或 ([] -50) 时,javascript 内部会发生什么类型转换?
- php - 调用发送函数后如何获取 Laravel 邮件响应?
- android - Fragment onCreate(), onCreateView() & onActivityCreated() 在创建父 Activity 时都调用了两次
- angular - 从组件中的 angular.json 获取 deployUrl
- html - 媒体查询在调整 chrome 大小但不能在 chrome 中切换设备响应模式时有效
- c++ - 传递右值与左值向量
- python - 通过条件值识别连续的单元格
- reactjs - 在本地存储来自 API 的 Fetch 数据
- xamarin.forms - 如何使用 Xamarin.Essentials 获取纬度和经度?
- firebase - onSnapshot 似乎在一段时间后停止工作