gpt4 book ai didi

python - 从嵌套子列表返回八元组模式

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:40 25 4
gpt4 key购买 nike

我如何从 python 列表或从 numpy 数组更容易地创建下面描述的模式。

假设我有这样一个列表列表:

[
[a,a,0,a],
[0,b,0,b],
[c,0,c,c]
]

返回的列表应该按遍历顺序循环遍历嵌套列表(子列表 1 的元素 1、子列表 2 的元素 1 等等),但始终创建​​八元列表大小。

[
[a,0,c,0,0,0,0,0],
[a,b,0,0,0,0,0,0],
[0,0,c,0,0,0,0,0],
[a,b,c,0,0,0,0,0]
]

在下一个示例中,我在子列表中有另一个子列表:

[
[a,a, 0, a],
[0,[b,b],0, b],
[c,c ,c,[c,c]]
]

结果模式应该又是一次遍历。这里的规则是对子列表中的元素一进行相同的处理,但是对于这些子列表中的元素二,只考虑具有这些深度的元素并将它们用在自己的八元组模式中。

[
[a,0,c, 0,0,0,0,0],
[a,b,c, 0,0,0,0,0],
[0,b,0, 0,0,0,0,0],
[0,0,c, 0,0,0,0,0],
[a,b,c, 0,0,0,0,0],
[0,0,c, 0,0,0,0,0],
]

另一个例子:

[
[a ,a ] ,
[b ,[b,b,b]],
[[c,c],0 ]
]

[
[a,b,c,0,0,0,0,0],
[0,0,c,0,0,0,0,0],
[a,b,0,0,0,0,0,0],
[0,b,0,0,0,0,0,0],
[0,b,0,0,0,0,0,0]
]

如果子列表有不同的长度:

[
[a,0],
[b,[b,b],b]
]

[
[a,b,0,0,0,0,0,0],
[0,b,0,0,0,0,0,0],
[0,b,0,0,0,0,0,0],
[0,b,0,0,0,0,0,0]
]

有人可以告诉我一种方法如何处理遍历和使用嵌套列表处理这些异常并始终返回八元组吗?是否有其他容器或结构可以使这些模式更容易接收?

提前致谢

最佳答案

以下是我解决问题的方法:

from functools import reduce

original = [
['a', 0],
['b', ['b', 'b'], 'b']
]

max_len = max([len(i) for i in original])
padded_original = [
(i + [0] * max_len)[:max_len]
for i in original
]
print(padded_original)
# [['a', 0, 0], ['b', ['b', 'b'], 'b']]

max_col_lens = reduce(
lambda a, b: [max(a[i], b[i]) for i in range(len(a))],
[
[len(xi) if isinstance(xi, list) else 1 for xi in x]
for x in padded_original
]
)
print(max_col_lens)
# [1, 2, 1]


original_transformed = [
reduce(
lambda a, b: a + b,
[(item + [0] * size)[:size] for (item, size) in row]
) for row in [
zip(
[xi if isinstance(xi, list) else [xi] for xi in x],
max_col_lens
) for x in padded_original
]
]
print(original_transformed)
# [['a', 0, 0, 0], ['b', 'b', 'b', 'b']]

result_list = [
[0 for i in range(8)]
for j in range(
sum(
reduce(
lambda a, b: [max(a[i], b[i]) for i in range(len(a))],
[
[len(xi) if isinstance(xi, list) else 1 for xi in x]
for x in padded_original
]
)
)
)
]
print(result_list)
# [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]

# rotating transformed_original_transformed
for i in range(len(original_transformed)):
for j in range(len(original_transformed[i])):
result_list[j][i] = original_transformed[i][j]

print(result_list)
# [['a', 'b', 0, 0, 0, 0, 0, 0], [0, 'b', 0, 0, 0, 0, 0, 0], [0, 'b', 0, 0, 0, 0, 0, 0], [0, 'b', 0, 0, 0, 0, 0, 0]]

关于python - 从嵌套子列表返回八元组模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57108341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com