gpt4 book ai didi

python - 从 Python 列表中删除坐标

转载 作者:太空宇宙 更新时间:2023-11-04 00:13:30 25 4
gpt4 key购买 nike

这是我上一个问题的后续问题: Python3 Numpy np.where Error .

我有 2 个这样的列表:

x = [None,[1, 15, 175, 20],
[150, 175, 18, 20],
[150, 175, 18],
[192, 150, 177],...]


y = [None,[12, 43, 55, 231],
[243, 334, 44, 12],
[656, 145, 138],
[12, 150, 177],
[150, 177, 188],...]

我想删除小于 30 的 x 值和与删除的 x 值相对应的 y 值。 (例如,x[1]y[1] 中的 (x,y) = (1,12))

为了做到这一点,我得到了更正的 x 列表:

In : [[v2 for v2 in v1 if v2>=30] for v1 in x[1:]]
Out: [[175], [150, 175], [150, 175], [192, 150, 177]]

我还得到了剩余 x 值的坐标:

In : [(i,j) for i,v1 in enumerate(x[1:]) for j,v2 in enumerate(v1) if v2<30]
Out: [(0, 0), (0, 1), (0, 3), (1, 2), (1, 3), (2, 2)]

现在我想使用这些坐标从 y 中删除项目。

我该如何实现?

最佳答案

要获得更正的 y 值,我建议第一种方法是完全绕过坐标。原因是你可能会一路上得到空列表,这会破坏你没有特别跟踪它们的输出的形状。此外,删除元素通常比一开始就不包含它们要尴尬得多。

以与更正 x 相同的方式制作 y 的更正版本会容易得多:

y_corr = [[n for m, n in zip(row_x, row_y) if m >= 30] for row_x, row_y in zip(x, y)]

这里我们刚刚使用了zip以处理一组列表的相同方式遍历两组列表。

如果您绝对坚持使用坐标,我建议您完全复制 y 并从更正后的副本中删除元素。您必须在每一行中向后移动以避免改变坐标的含义(例如 reversed )。你可以使用 itertools.groupby对每一行进行实际迭代:

y_corr = [row.copy() for row in y]
for r, group in groupby(reversed(coord), itemgetter(0)):
for c in map(itemgetter(1), group):
del y_corr[r][c]

您可以单独反转每个组,而不是反转坐标,例如使用 map(itemgetter(1), reversed(group))

更好的方法可能是计算保留值而不是丢弃值的坐标。我建议预先分配输出列表,以帮助跟踪空列表并保持形状:

from itertools import groupby
from operator import itemgetter

coord = [(r, c) for r, row in enumerate(x) for c, n in enumerate(row) if n >= 30]

y_corr = [[]] * len(x)
for r, group in groupby(coord, itemgetter(0)):
y_corr[r] = [y[r][c] for c in map(itemgetter(1), group)]

如果您不关心保留空行,您可以跳过循环并改用单行代码:

y_corr = [[y[r][c] for c in map(itemgetter(1), group)] for r, group in groupby(coord, itemgetter(0))]

关于python - 从 Python 列表中删除坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51716479/

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