繁体   English   中英

在嵌套列表中的所有子列表中查找子列表中相同的元素索引

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM