Python计算一个列表中有多少个重复项,其中有许多列表

2024-05-29 02:36:36 发布

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

我有以下清单:

l = [['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 50"', 'u', '5', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 55"', 'u', '3', 'NEC', 'C553', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55],
['', 10.0, '', 'Ecran Standard 55"', 'u', '3', 'NEC', 'C551', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55],
['', 10.0, '', 'Ecran Standard 55"', 'u', '1', 'NEC', 'C551', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55]]

我想删除重复项,但通过引用“C501、C553、C551”,然后乘以QTE

我有这个密码

count = 0

for ind, ele in enumerate(l,1):
    if ele not in l[ind:]:
        for team in l:
            if team[7] == ele[7]:
                count+=1
        print("{} -> {}\n\n".format(ele,count))
    count = 0

但是,它删除了重复列表,但是我想要的是通过引用删除所有重复的列表,然后将它们相乘

例:

['', 10.0, '', 'Ecran Standard 50"', 'u', '14', 'NEC', 'C501', '21', 'TECHDATA', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0]
['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C553', '21', 'TECHDATA', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0]
['', 10.0, '', 'Ecran Standard 50"', 'u', '4', 'NEC', 'C551', '21', 'TECHDATA', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0]

我怎样才能解决这个问题


Tags: in列表forifcountteamstandardnec
3条回答

试试这个:)

l = [['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 50"', 'u', '5', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 55"', 'u', '3', 'NEC', 'C553', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55],
['', 10.0, '', 'Ecran Standard 55"', 'u', '3', 'NEC', 'C551', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55],
['', 10.0, '', 'Ecran Standard 55"', 'u', '1', 'NEC', 'C551', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55]]

result = []

for x in l:
    value = x[7]
    find = False
    for y in result:
        if y[7] == value:
            find = True
    if not find:
        result.append(x)
print(result)
import pandas as pd

df = pd.DataFrame(l)
df[5] = df[5].astype(int)
df[5] = df.groupby(7)[5].transform('sum')
df.drop_duplicates()

这里有几种不同的方法可以通过itertools.groupby()解决这个问题:

from itertools import chain, groupby
from operator import itemgetter
from pprint import pprint

l = [['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 50"', 'u', '5', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
['', 10.0, '', 'Ecran Standard 55"', 'u', '3', 'NEC', 'C553', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55],
['', 10.0, '', 'Ecran Standard 55"', 'u', '3', 'NEC', 'C551', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55],
['', 10.0, '', 'Ecran Standard 55"', 'u', '1', 'NEC', 'C551', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55]]

MODEL_NO = itemgetter(7)
METRIC_FIELD = 5

这将根据C501/C551/C553值重复删除子列表:

l_deduped = []
for model_no, model_data in groupby(sorted(l, key=MODEL_NO), key=MODEL_NO):
    l_deduped.append(next(model_data))

pprint(l_deduped, width=200)

输出:

[['', 10.0, '', 'Ecran Standard 50"', 'u', '3', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
 ['', 10.0, '', 'Ecran Standard 55"', 'u', '3', 'NEC', 'C551', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55],
 ['', 10.0, '', 'Ecran Standard 55"', 'u', '3', 'NEC', 'C553', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55]]

这将基于C501/C551/C553值重复子列表,并在'u'值之后的字段上执行求和聚合:

l_deduped_and_sum = []
for model_no, model_data in groupby(sorted(l, key=MODEL_NO), key=MODEL_NO):
    template_row = next(model_data)
    model_sums = sum(int(data[METRIC_FIELD]) for data in chain([template_row], model_data))
    template_row[METRIC_FIELD] = str(model_sums)
    l_deduped_and_sum.append(template_row)

pprint(l_deduped_and_sum, width=200)

输出:

[['', 10.0, '', 'Ecran Standard 50"', 'u', '14', 'NEC', 'C501', '21', '', '', '', '', 1.0, 714.04, 2142.12, 1.2, 855.0, 2565.0],
 ['', 10.0, '', 'Ecran Standard 55"', 'u', '4', 'NEC', 'C551', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55],
 ['', 10.0, '', 'Ecran Standard 55"', 'u', '3', 'NEC', 'C553', '21', '', '', '', '', 0.0, 1035.04, 1035.04, 1.3, 1345.55, 1345.55]]

相关问题 更多 >

    热门问题