我有以下(x,y)
个元组的列表:
[(0, 0), (36, 0), (0, 36), (4, 19), (19, 4), (36, 36)]
我要迭代x
的最小x+1
的元组和我要迭代y
的最小y+1
的元组。这将产生以下内容:
[(1, 1), (36, 1), (1, 36), (4, 19), (19, 4), (36, 36)]
由于最小的x
和y
均为0,因此我们将其更改为0+1
。
从逻辑上讲,我想对最大的x
和y
=>执行类似的操作,将最大的x
更改为x-1
,最大的y
更改为y-1
。
执行这两项更改后的最终输出应为:
[(1, 1), (35, 1), (1, 35), (4, 19), (19, 4), (35, 35)]
最有效的执行方式是什么?我将使用包含超过1000个元素的列表,因此时间效率是关键。
答案 0 :(得分:0)
首先找到最小的x和y值。
>>> lst = [(0, 0), (36, 0), (0, 36), (4, 19), (19, 4), (36, 36)]
>>> min_x = min(x for x, y in lst)
>>> min_y = min(y for x, y in lst)
>>> min_x
>>> 0
>>> min_y
>>> 0
然后,对lst
进行迭代,并将1
添加到等于其各自最小值的每个坐标。
>>> lst = [(x + (x == min_x), y + (y == min_y)) for x, y in lst]
>>> lst
>>> [(1, 1), (36, 1), (1, 36), (4, 19), (19, 4), (36, 36)]
请注意,将True
添加到数字上会添加1
,将False
添加到数字上会添加零,例如
>>> 36 + True
>>> 37
>>> 36 + False
>>> 36
您可以使用内置的max
以类似的方式处理问题的第二部分。
答案 1 :(得分:0)
最有效的执行方式是什么?
这是一个很好的示例,如果您可以使用第三方库,矢量化操作将很有帮助。例如,使用Pandas,您可以将布尔索引与列配合使用:
import pandas as pd
L = [(0, 0), (36, 0), (0, 36), (4, 19), (19, 4), (36, 36)]
df = pd.DataFrame(L)
for col in df:
df.loc[df[col].eq(df[col].min()), col] += 1
print(list(map(tuple, df.values)))
[(1, 1), (36, 1), (1, 36), (4, 19), (19, 4), (36, 36)]
也就是说,〜1000个元素是一个相对较小的数字,所以没有保证熊猫的结构开销将被矢量化收益所抵消。