我正在尝试随机地嵌套列表的嵌套列表中的一个元素。
例如我有:
list1=[[['a', 'b', 'c', 1], ['a', 'b', 'c', 2]], [['a', 'b', 'c', 3], ['a', 'b', 'c', 4]], [['a', 'b', 'c', 5], ['a', 'b', 'c', 6]]]
我想随机调整每个子列表的第三个元素(浮点数),同时保持其余列表条目及其嵌套列表中的结构完整。例如。这样:
list1=[[['a', 'b', 'c', 1], ['a', 'b', 'c', 6]], [['a', 'b', 'c', 4], ['a', 'b', 'c', 2]], [['a', 'b', 'c', 3], ['a', 'b', 'c', 5]]]
到目前为止,我提出了以下内容:
import random
list1 = [[['a', 'b', 'c', 1], ['a', 'b', 'c', 2]], [['a', 'b', 'c', 3], ['a', 'b', 'c', 4]], [['a', 'b', 'c', 5], ['a', 'b', 'c', 6]]]
vals = [x[3] for line in list1 for x in line]
shuffled_vals = random.sample(vals,len(vals))
counter = 0
for i in range(len(list1)):
for j in range(len(list1[i])):
list1[i][j][3] = shuffled_vals[counter]
counter += 1
尽管这可以按预期的方式工作,但我想知道是否有更优雅的/ Pythonic解决方案。另外,我不确定此缩放的程度如何-我打算在其中使用的列表将包含数百万个条目。
非常感谢任何改进此代码的技巧(以更Pythonic或更高效的方式)。
使用迭代器可能会有所帮助:
import random
list1=[[['a', 'b', 'c', 1], ['a', 'b', 'c', 2]], [['a', 'b', 'c', 3], ['a', 'b', 'c', 4]], [['a', 'b', 'c', 5], ['a', 'b', 'c', 6]]]
mix = iter(random.sample([i[3] for j in list1 for i in j], len([i[3] for j in list1 for i in j])))
for i, v in enumerate(list1):
for j, w in enumerate(v):
list1[i][j][3] = next(mix)
print(list1)
[[['a', 'b', 'c', 5], ['a', 'b', 'c', 6]], [['a', 'b', 'c', 3], ['a', 'b', 'c', 2]], [['a', 'b', 'c', 1], ['a', 'b', 'c', 4]]]
您的代码对我来说看起来不错。除了不更改(就地修改)列表中的内容外,我几乎执行相同的操作。通常,您还可以避免使用range(len(X))
,而是更喜欢直接迭代元素。
将其放在一起将得到如下所示:
from random import sample
vals = [x[3] for line in list1 for x in line]
vals = sample(vals, len(vals))
new_list = [[sub_l[:3] + [vals.pop()] for sub_l in l] for l in list1]