仅使用tup的前两部分将一个3元组与一个3元组列表进行比较

2024-10-01 22:25:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python程序中有一个3元组的列表,我正在构建这个列表,同时查看一个文件(一次一个),设置如下:

(feature,combination,durationOfTheCombination),

这样,如果找到特征和组合的唯一组合,它将被添加到列表中。列表本身也有类似的设置,但是durationofcombination是共享唯一组合(feature,combination)的所有持续时间的总和。因此,在决定是否应该将其添加到列表中时,我只需要比较元组的前两部分,如果找到匹配项,则将持续时间添加到相应的列表项中。你知道吗

下面是一个清晰的例子。如果输入是 (ABC,123,10);(ABC,123,10);(DEF,123,5);(ABC,123,30);(EFG,456,30) 输出将是(ABC,123,50);(DEF,123,5);(EFG,456,30)。你知道吗

有没有办法做这个比较?你知道吗


Tags: 文件程序列表def特征feature例子持续时间
3条回答

在这里,dict似乎比list更合适,前两个字段是键。为了避免每次都检查密钥是否已经存在,可以使用defaultdict。你知道吗

from collections import defaultdict

d = defaultdict(int)
for t in your_list:
    d[t[:2]] += t[-1]

你可以用^{}来做

In [42]: from collections import Counter
In [43]: lst = [('ABC',123,10),('ABC',123,10),('DEF',123,5)]
In [44]: [(i[0],i[1],i[2]*j) for i,j in Counter(lst).items()]
Out[44]: [('DEF', 123, 5), ('ABC', 123, 20)]

根据OP的建议,如果它有不同的值,请使用groupby

In [26]: lst = [('ABC',123,10),('ABC',123,10),('ABC',123,25),('DEF',123,5)]

In [27]: [tuple(list(n)+[sum([i[2] for i in g])]) for n,g in groupby(sorted(lst,key = lambda x:x[:2]), key = lambda x:x[:2])]
Out[27]: [('ABC', 123, 45), ('DEF', 123, 5)]

如果你不想用计数器,你可以用dict代替。你知道吗

setOf3Tuples = dict()

def add3TupleToSet(a):
  key = a[0:2]
  if key in setOf3Tuples:
    setOf3Tuples[a[0:2]] += a[2]
  else:
    setOf3Tuples[a[0:2]] = a[2]

def getRaw3Tuple():
  for k in setOf3Tuples:
    yield k + (setOf3Tuples[k],)

if __name__ == "__main__":
  add3TupleToSet(("ABC",123,10))
  add3TupleToSet(("ABC",123,10))
  add3TupleToSet(("DEF",123,5))
  print([i for i in getRaw3Tuple()])

相关问题 更多 >

    热门问题