![](/img/trans.png)
[英]How to turn multiple lists into a list of sublists where each sublist is made up of the same index items across all lists?
[英]Find index of element in sublist that is same across all the sublists in a nested list
我有一个这样的嵌套列表:
[[8.0, 16.275953626987484, 5.923962654520423],
[8.0, 3.0076746636087575, 17.05737063904884]),
([8.0, 3.0076746636087575, 17.05737063904884],
[8.0, -13.268278963378728, 11.133407984528427]),
([8.0, -13.268278963378728, 11.133407984528427],
[8.0, -16.275953626987487, -5.923962654520416]),
([8.0, -16.275953626987487, -5.923962654520416],
[8.0, -3.0076746636087694, -17.057370639048848]),
([8.0, -3.0076746636087694, -17.057370639048848],
[8.0, 13.268278963378716, -11.133407984528437]),
([8.0, 13.268278963378716, -11.133407984528437],
[8.0, 16.275953626987484, 5.923962654520423]]
在该列表中,我想删除子列表中在同一索引中具有相同值的元素,例如,在这里我想从所有子列表中删除 8,因为它在索引 0 处的所有子列表中都是相同的。
在没有太多硬编码条件的情况下,我如何以一种简短而简单的方式做到这一点?
这里要注意的一件事是子列表总是有 3 个元素,而外部嵌套列表的长度可以是任何东西。
您的问题似乎有点奇怪,但这是一个解决方案:
example = [
([8.0, 16.275953626987484, 5.923962654520423],
[8.0, 3.0076746636087575, 17.05737063904884]),
([8.0, 3.0076746636087575, 17.05737063904884],
[8.0, -13.268278963378728, 11.133407984528427]),
([8.0, -13.268278963378728, 11.133407984528427],
[8.0, -16.275953626987487, -5.923962654520416]),
([8.0, -16.275953626987487, -5.923962654520416],
[8.0, -3.0076746636087694, -17.057370639048848]),
([8.0, -3.0076746636087694, -17.057370639048848],
[8.0, 13.268278963378716, -11.133407984528437]),
([8.0, 13.268278963378716, -11.133407984528437],
[8.0, 16.275953626987484, 5.923962654520423])
]
def unchanging_mask(data):
def all_inner_iterables(xss):
if xss and isinstance(xss[0], (list, tuple)):
for xs in xss:
yield from all_inner_iterables(xs)
else:
yield xss
return list(map(lambda xs: len(set(xs)) == 1, zip(*all_inner_iterables(data))))
def select_columns(data, mask):
if data and isinstance(data[0], (list, tuple)):
return type(data)(select_columns(xs, mask) for xs in data)
else:
return type(data)(x for i, x in enumerate(data) if not mask[i])
mask = unchanging_mask(example)
result = select_columns(example, mask)
print(result)
它的工作原理是首先确定一个掩码,它告诉它在嵌套的最深层次上,列是否总是对每个元素具有相同的值。
然后它将该掩码应用于嵌套结构的最深级别的所有值,保留类型。
它确实假设最深层次的元素都具有相同的大小。
这是一个列表理解方法
data = [
[8.0, 16.275953626987484, 5.923962654520423],
[8.0, 3.0076746636087575, 17.05737063904884],
[8.0, 3.0076746636087575, 17.05737063904884],
[8.0, -13.268278963378728, 11.133407984528427],
[8.0, -13.268278963378728, 11.133407984528427],
[8.0, -16.275953626987487, -5.923962654520416],
[8.0, -16.275953626987487, -5.923962654520416],
[8.0, -3.0076746636087694, -17.057370639048848],
[8.0, -3.0076746636087694, -17.057370639048848],
[8.0, 13.268278963378716, -11.133407984528437],
[8.0, 13.268278963378716, -11.133407984528437],
[8.0, 16.275953626987484, 5.923962654520423]
]
index_to_remove = [i for i in range((len(data[0]))) if len({_[i] for _ in data}) == 1]
print(index_to_remove)
# [0]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.