在列表的嵌套列表中改组特定元素

问题描述 投票:1回答:1

我正在尝试随机地嵌套列表的嵌套列表中的一个元素。

例如我有:

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或更高效的方式)。

python python-3.x random itertools
1个回答
1
投票

使用迭代器可能会有所帮助:

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]]]

0
投票

您的代码对我来说看起来不错。除了不更改(就地修改)列表中的内容外,我几乎执行相同的操作。通常,您还可以避免使用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]
© www.soinside.com 2019 - 2024. All rights reserved.