gpt4 book ai didi

python - 如何在 Python 中存储条件列表?

转载 作者:行者123 更新时间:2023-11-28 18:37:54 24 4
gpt4 key购买 nike

我正在迭代生成数据列表。这些列表中的每一个都具有相同数量的值,我的目标是存储 N 最差列表,该标准由特定列定义。我尝试了几种方法,但没有一种让我满意,我想知道我是否遗漏了什么。

例如,假设我的每一行都包含 5 个元素,并且我想保留 10 个最差的行。我想比较最后一个值,知道这个值总是正的。

array = [[0] * 5] * 10
while (...)
# processing
# I now have a "my_row" that looks like [5, 102.24, -3.12, 2, 7.37] for instance
indexes = [array.index(row) for row in array if row[-1] == min(r[-1] for r in array)] # can return several indexes
if array[indexes[0]][-1] < my_row[-1]:
array[indexes[0]] = my_row

但是,这个解决方案远非优雅,也不是最优的。有谁知道如何更好地编码?

感谢您的帮助!

最佳答案

sortedContainers库有一个 sortedlistwithkey 容器,可以做你想做的事:

rows = [[5, 102.24, -3.12, 2, 9.36], [2, 102.24, -3.12, 2, 388], [2, 102.24, -3.12, 1, 1.54],
[5, 102.24, -3.12, 2, 1.11], [5, 102.24, -3.12, 2, 7.35], [5, 102.24, -3.12, 2, 54],
[5, 102.24, -3.12, 2, 1.53]]

from sortedcontainers import sortedlistwithkey
from operator import itemgetter
array = sortedlistwithkey.SortedListWithKey(key=itemgetter(-1))

n = 3
for row in rows:
array.add(row)
if len(array) > n:
array.pop(0)
print(array.as_list())

输出:

[[5, 102.24, -3.12, 2, 9.36], [5, 102.24, -3.12, 2, 54], [2, 102.24, -3.12, 2, 388]]

你所要做的就是每次弹出最低的元素。

或者取反键值,从末尾弹出:

from sortedcontainers import sortedlistwithkey

array = sortedlistwithkey.SortedListWithKey(key=lambda x: -x[-1])
n = 3
for row in rows:
array.add(row)
if len(array) > n:
array.pop()
print(array.as_list())

输出:

[[2, 102.24, -3.12, 2, 388], [5, 102.24, -3.12, 2, 54], [5, 102.24, -3.12, 2, 9.36]]

最大数组将增长到 n+1,您无需排序、复制或切片。

如果你只关心最后一个值,你也可以稍微修改 bisect_right 函数:

def bisect_right(a, x, lo=0, hi=None):
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
while lo < hi:
mid = (lo + hi) // 2
if x > a[mid][-1]:
hi = mid
else:
lo = mid + 1
return lo

array = []
n = 3
for row in rows:
b = bisect_right(array, row[-1])
array.insert(b, row)
if len(array) > n:
array.pop()
print(array)

输出:

[[2, 102.24, -3.12, 2, 388], [5, 102.24, -3.12, 2, 100], [2, 102.24, -3.12, 97]]

所有具有相同最大值的行:

rows = [ [5, 102.24, -3.12, 2, 100], [2, 102.24, -3.12, 2, 2], [2, 102.24, -3.12, 97],
[5, 102.24, -3.12, 2, 1.11], [5, 102.24, -3.12, 2, 23], [5, 102.24, -3.12, 2, 54],
[5, 102.24, -3.12, 2, 1.53], [5, 102.24, -3.12, 2, 100], [5, 102.24, -3.12, 2, 100]]

输出:

[[5, 102.24, -3.12, 2, 100], [5, 102.24, -3.12, 2, 100], [5, 102.24, -3.12, 2, 100]]

如果您关心多个值,您还可以将更多键传递给 sortedlistwithkey:

array = sortedlistwithkey.SortedListWithKey(key=lambda x: (-x[-1], -x[-2]))

您还可以通过使用 cython 进行一些简单的类型转换和编译来加速 bisect_function:

def bisect_right(a, int x, int lo=0, int hi= -1):
cdef int mid
if lo < 0:
raise ValueError('lo must be non-negative')
if hi == -1:
hi = len(a)
while lo < hi:
mid = (lo + hi) // 2
if x > a[mid][-1]:
hi = mid
else:
lo = mid + 1
return lo

关于python - 如何在 Python 中存储条件列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30639989/

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