使用元组列表列表

时间:2013-05-02 14:45:26

标签: python list tuples max

我有这个清单:

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]

6 个答案:

答案 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])