Python汇总列表元素根据其他列表

时间:2019-11-27 16:35:39

标签: python list

我有两个列表:

x = [1, 2, 3, 1, 1, 2, 3]
y = [1.3, 0.5, 0.7, 1.9, 2.5, 3.1, 1.4]

我想根据x中每个重复元素对y个元素求和。

例如,对于x (= 1)的第一个元素,我必须对索引为 0、3和4 的所有y元素求和在x中 1 。我要保存元素及其总和。

我的输出将是这样的:

sum = [[1, 5.7],
       [2, 3.6],
       [3, 2.1]]

我该如何编码?

3 个答案:

答案 0 :(得分:4)

这是使用defaultdict的一种方法:

from collections import defaultdict

d = defaultdict(float)
for k,v in zip(x,y):
    d[k] += v

list(map(list, d.items()))
# [[1, 5.7], [2, 3.6], [3, 2.0999999999999996]]

答案 1 :(得分:3)

您可以使用<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="false" > <com.google.android.material.appbar.AppBarLayout android:id="@+id/app_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay" > <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/header" > // Header of variable height </androidx.constraintlayout.widget.ConstraintLayout> </com.google.android.material.appbar.AppBarLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_items" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_width="match_parent" /> </androidx.coordinatorlayout.widget.CoordinatorLayout>

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        clContent.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                clContent.getViewTreeObserver().removeOnPreDrawListener(this);

                int minHeight = calculateMinHeight();
                clHeader.setMinHeight(minHeight);

                return false;
            }
        });
}

输出:

itertools.groupby

答案 2 :(得分:2)

这是使用单线的解决方案:

>>> [[x_num, sum([y_num for i, y_num in enumerate(y) if x[i] == x_num])] for x_num in set(x)]
[[1, 5.7], [2, 3.6], [3, 2.0999999999999996]]