我有这个清单:
dCF3v=[[(1.90689635276794, -44704.76171875)],
[(1.90689635276794, -44705.76171875)],
[(1.90689635276794, -44706.76171875)],
[(1.90689635276794, -44707.76171875)]
]
我想比较每个元组的第二个元素并找到绝对最大值:
-44707.76171875
我的代码如下:
CF3=0
for x in dCF3v:
if abs(x[1])>abs(CF3):
CF3=x[1]
答案 0 :(得分:3)
你有一个列表,其中包含一个包含元组的列表。所以,你可能想要abs(x[0][1])
那么你的命令可以简单地是:
max(abs(x[0][1]) for x in dCF3v)
更重要的是,您可能实际想要将数据结构更改为包含元组的列表:
dCF3v = [x[0] for x in dCF3v]
然后看起来像:
max(abs(x[0]) for x in dCF3v)
或者,如果您想要返回整个元组而不是仅返回第二个元素:
max(dCF3v,key=lambda x:abs(x[0]))
答案 1 :(得分:1)
这是因为你有一个元组列表列表,而不仅仅是一个元组列表。请考虑以下代码,或者您只需将x[1]
更改为x[0][1]
。
>>> max(abs(x[0][1]) for x in dCF3v)
44706.76171875
这使用内置函数max
,它选择迭代中的最大元素和生成器,将abs函数映射到每个元素,这将使其保持快速和内存效率。
答案 2 :(得分:1)
max(map(lambda t: abs(t[1]),chain(*dCF3v))))
或
max(map(lambda t: abs(t[1]),chain.from_iterable(dCF3v)))
操作实例:
print(list(chain(*dCF3v)))
print([abs(t[1]) for t in list(chain(*dCF3v))])
产地:
>>>
[(1.90689635276794, -44706.76171875), (1.90689635276794, -44706.76171875), (1.90689635276794, -44706.76171875), (1.90689635276794, -44706.76171875)]
[44706.76171875, 44706.76171875, 44706.76171875, 44706.76171875]
答案 3 :(得分:1)
使用max
功能,这可能是最直接的解决方案:
max(dCF3v, key=lambda x: abs(x[0][1]))[0][1]
=> -44706.76171875
答案 4 :(得分:1)
我的尝试是帮助您获得最快,最易读的版本。为此,我的建议是首先创建一个生成器,它将产生您想要的值。然后在此生成器上执行内置max()
函数。这更快/更高效的原因几乎与在max()
函数中嵌入生成器几乎相同,只有使用局部变量在Python中比使用全局变量更快,一旦max()
函数不需要查找像x[0][1]
这样的索引更快。
vals = (abs(x[0][1]) for x in dCF3v)
print max(vals)
定时:
我使用以下代码计算了我和mgilsons之间的差异:
import time
dCF3v = [[(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)]]
def method_inbar(l):
vals = (abs(x[0][1]) for x in l)
max(vals)
def method_mgilson(l):
max(abs(x[0][1]) for x in l)
def timer(multiplier=[1,10,100,1000]):
for m in multiplier:
print "timing the speed using multiplier: %s" % m
now = time.time()
for i in range(100000):
method_inbar(dCF3v*m)
print "inbar's method: %r" % (time.time() - now)
now = time.time()
for i in range(100000):
method_mgilson(dCF3v*m)
print "mgilson's method: %r" % (time.time() - now)
timer()
每次都会在更大的数据集上运行测试:
>>>
timing the speed using multiplier: 1
inbar's method: 0.18899989128112793
mgilson's method: 0.192000150680542
timing the speed using multiplier: 10
inbar's method: 0.8540000915527344
mgilson's method: 0.8229999542236328
timing the speed using multiplier: 100
inbar's method: 7.287999868392944
mgilson's method: 7.45199990272522
timing the speed using multiplier: 1000
inbar's method: 71.42099976539612
mgilson's method: 77.18499994277954
正如您所看到的,大量数据。它更快。唯一的原因是速度较慢是因为启动val需要时间,而且因为我运行了很多次函数,所以看起来要慢得多,但是如果你只运行一次这样的话,那么对于较小的数据集你应该感觉没有区别,但你应该感觉到大数据集的巨大差异。 (几秒钟只有1000次)
答案 5 :(得分:1)
简单地做
dCF3v=[[(1.90689635276794, -44706.76171875)],
[(1.90689635276794, -44706.76171875)],
[(1.90689635276794, -44706.76171875)],
[(1.90689635276794, -44706.76171875)]
]
M = max([x[0][1] for x in dCF3v])