Python - 比较列表列表并选择最大值

时间:2017-01-04 19:50:31

标签: python list for-loop compare nested-lists

我有一份清单清单:

l = [['a1', 2], ['a1', 3], ['a1', 1], ['b1', 4], ['b1', 2], ['b1', 6], ['c1', 2]]

我想将每个“子列表”与其他“子列表”进行比较,匹配索引[0]具有相同值的那些,并保留那些索引最大的{{1}结果是这样的结果:

[1]

我一直在尝试各种for循环和条件语句,但我已经陷入困境。

有人能帮我一把,让我走上正轨吗?

4 个答案:

答案 0 :(得分:4)

使用here

 @Override
 public int getItemViewType(int position) {
  return list.get(position) != null ? 1 : 0;
 }

答案 1 :(得分:2)

自然答案正在使用itertools.groupby,按子列表的第一个元素分组,只需将max应用于每个组。由于第一个分组元素是相同的,max根据第二个元素自然地最大:整数。

import itertools

l=[['a1',2],['a1',3],['a1',1],['b1',4],['b1',2],['b1',6],['c1',2]]

print([max(v) for _,v in itertools.groupby(l,lambda x : x[0])])

结果:

[['a1', 3], ['b1', 6], ['c1', 2]]

注意:如果列表未按照第一个元素值排序,则需要使用sorted(l)而不是l

答案 2 :(得分:1)

创建一个字典以保存所有最大值:

public final class user$sqrt extends AFunction {
    public static final Object const__0 = Double.valueOf(1.0D);

    public static Object invokeStatic(Object x) {
        user$sqrt$s__44945 s = null;
        user$sqrt$good_enough_QMARK___44947 good_enough_QMARK_ = null;
        user$sqrt$improve__44949 improve = null;
        s = new user$sqrt$s__44945(good_enough_QMARK_, improve);
        good_enough_QMARK_ = new user$sqrt$good_enough_QMARK___44947(x);
        Object var10002 = x;
        x = null;
        improve = new user$sqrt$improve__44949(var10002);
        user$sqrt$s__44945 var10000 = (user$sqrt$s__44945)s;
        ((user$sqrt$s__44945)s).good_enough_QMARK_ = good_enough_QMARK_;
        var10000.improve = improve;
        user$sqrt$good_enough_QMARK___44947 var4 = (user$sqrt$good_enough_QMARK___44947)good_enough_QMARK_;
        user$sqrt$improve__44949 var5 = (user$sqrt$improve__44949)improve;
        return ((IFn)s).invoke(const__0);
    }

}

public final class user$sqrt$good_enough_QMARK___44947 extends AFunction {
    Object x;
    public static final Var const__1 = (Var)RT.var("user", "abs");
    public static final Var const__3 = (Var)RT.var("user", "square");

    public user$sqrt$good_enough_QMARK___44947(Object var1) {
        this.x = var1;
    }

    public Object invoke(Object guess) {
        DO var10000 = (DO)const__1.getRawRoot();
        DO var10001 = (DO)const__3.getRawRoot();
        Object var10002 = guess;
        guess = null;
        return Numbers.lt(var10000.invokePrim(RT.doubleCast((Number)Numbers.minus(var10001.invokePrim(RT.doubleCast((Number)var10002)), this.x))), 1.0E-4D)?Boolean.TRUE:Boolean.FALSE;
    }
}

public final class user$sqrt$improve__44949 extends AFunction {
    Object x;
    public static final Var const__0 = (Var)RT.var("user", "avg");

    public user$sqrt$improve__44949(Object var1) {
        this.x = var1;
    }

    public Object invoke(Object guess) {
        DDO var10000 = (DDO)const__0.getRawRoot();
        double var10001 = RT.doubleCast((Number)Numbers.divide(this.x, guess));
        Object var10002 = guess;
        guess = null;
        return var10000.invokePrim(var10001, RT.doubleCast((Number)var10002));
    }
}

答案 3 :(得分:0)

您可以{@ 3}}替换@Patrick Haugh解决方案中的lambda表达式,如下所示:

In [18]: from itertools import groupby

In [19]: from operator import itemgetter

In [20]: l = [['b1', 2], ['a1', 2], ['a1', 3], ['c1', 2], ['a1', 1], ['b1', 4], ['b1', 6]]

In [21]: [max(g, key=itemgetter(1)) for _, g in groupby(sorted(l), itemgetter(0))]
Out[21]: [['a1', 3], ['b1', 6], ['c1', 2]]