微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于另一个列表python计算列表中所有唯一元素的总和

如何解决基于另一个列表python计算列表中所有唯一元素的总和

我有两个这样的列表,

a=[['a','b','c'],['b',['a','d'],['x']]
b=[[1,2,3],[4,5],[6,7],[8]] (the size of a and b is always same)

现在我想用唯一元素的总和创建两个列表,所以最终的列表应该是这样的,

 a=['a','c','d','x']
 b=[7,6,8,7,8] (sum of all a,b,d,d and x)

我可以使用 for 循环来做到这一点,但正在寻找一些有效的方法来减少执行时间。

解决方法

不是那么pythonic,但会完成这项工作:

a=[['a','b','c'],['b',['a','d'],['x']]
b=[[1,2,3],[4,5],[6,7],[8]]

mapn = dict()
for elt1,elt2 in zip(a,b):
    for e1,e2 in zip(elt1,elt2):
        mapn[e1] = mapn.get(e1,0) + e2

elts = mapn.keys()
counts = mapn.values()

print(mapn)
print(elts)
print(counts)
,

您可以按照以下方式使用 zipcollections.Counter

from collections import Counter

c = Counter()
for la,lb in zip(a,b):
    for xa,xb in zip(la,lb):
        c[xa] += xb
 
list(c.keys())
# ['a','c','d','x']
list(c.values())
# [7,6,8,7,8]
,

这里有一些想法。

首先,要扁平化您的列表,您可以尝试:

a=[['a',[8]]

要拥有独特的元素,您可以执行类似的操作

A = set([item for sublist in a for item in sublist])

但我首先要做的(也许不是更有效)是:

import pandas as pd
import bumpy as np
LIST1 = [item for sublist in a for item in sublist]
LIST2 = [item for sublist in b for item in sublist]
df = pd.DataFrame({'a':LIST1,'b':LIST2})
df.groupby(df.a).sum()

输出:

enter image description here

,

归根结底,您将不得不使用两个 for 循环。我有一个使用 zipCounter 的单线解决方案。

第一种解决方案仅适用于所有字符串都是单个字符的特定情况,因为它创建了一个字符串,每个字母的数字都正确,然后获取每个字母的频率。

from collections import Counter

a = [['a',['x']]
b = [[1,[8]]

a,b = zip(*Counter(''.join(x*y for al,bl in zip(a,b) for x,y in zip(al,bl))).items())

对于更一般的情况,您可以这样做:

a,b = zip(*Counter(dict(p for al,b) for p in zip(al,bl))).items())
,

您可以使用 zip() 组合列表及其内部列表,然后将元组列表提供给字典构造函数,以获取包含每个字母值的字典列表。然后将这些字典转换为 Counter 并将它们相加。

a = [['a',['x']]
b = [[ 1,3 ],[ 4,5 ],[ 6,7 ],[ 8 ]]

from collections import Counter
from itertools import starmap

mapn        = sum(map(Counter,map(dict,starmap(zip,zip(a,b)))),Counter())
elts,counts = map(list,zip(*mapn.items()))

print(mapn)   # Counter({'c': 8,'x': 8,'a': 7,'d': 7,'b': 6})    
print(elts)   # ['a','x']    
print(counts) # [ 7,8]

详细说明:

  • zip(a,b) 将列表组合成子列表对。例如(['a',[1,3]),...
  • starmap(zip,...) 获取这些列表对,然后合并成字母数字对的子列表:[('a',1),('b',2),('c',3)],...
  • 这些对列表中的每一个都通过 map(dict,...) 转换为字典,然后通过 map(counter,...) 转换为 Counter 对象
  • 我们最终得到与每个子列表的配对相对应的 Counter 对象列表。应用 sum(...,Counter()) 将每个字母的总数计算到单个 Counter 对象中。
  • 除了是 Counter 对象之外,mapn 与您生成的字典完全相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?