Python 如何检查列表中列表的唯一性?

Python 如何检查列表中列表的唯一性?,python,list,Python,List,我有以下数据: [[prodcutname,price_rate,price,quantity]] [['phone', '500', 450.0, 1], ['phone', '500', 2250.0, 5], ['camera', '200', 1080.0, 6], ['laptop', '600', 540.0, 1], ['laptop', '600', 540.0, 1],['laptop', '600', 540.0, 1]] 现在,我需要做的是创建一个只包含唯一元素(产品)

我有以下数据:

[[prodcutname,price_rate,price,quantity]]

[['phone', '500', 450.0, 1], ['phone', '500', 2250.0, 5], ['camera', '200', 1080.0, 6], ['laptop', '600', 540.0, 1], ['laptop', '600', 540.0, 1],['laptop', '600', 540.0, 1]]
现在,我需要做的是创建一个只包含唯一元素(产品)的新列表,然后添加同一产品的其他值并将它们放入列表中。 理想的输出如下所示:

[['phone','500',2700,6],['camera','220',1080,6],....]
我试着用-

unique_list = ['phone', '500', 450.0, 1]

big_list = []
mylist = []

for i in range(len(larger_list)):
    for j in range(1,len(larger_list)):
        if(larger_list[i][0]==larger_list[j][0]):
            # Getting the sum or prices and number
            #Sum of price
            larger_list[j][2]=larger_list[i][2]+larger_list[j][2]

            #Sum of number
            larger_list[j][3]=larger_list[i][3]+larger_list[j][3]

            #Adding into a new list
            unique_list[0]=larger_list[i][0]
            unique_list[1]=larger_list[i][1]
            unique_list[2]=larger_list[j][2]
            unique_list[3]=larger_list[j][3]

            mylist.append(unique_list)
            big_list.append(mylist)
            mylist = []

return big_list

但是遇到了很多错误,都没有用。我甚至试着把它们编入字典。如何在Python中执行此操作?

您可以构建一个
dict

>>> l
[['camera', '200', 1080.0, 6], ['laptop', '600', 540.0, 1], ['laptop', '600', 540.0, 1], ['laptop', '600', 540.0, 1], ['phone', '500', 450.0, 1], ['phone', '500', 2250.0, 5]]
>>> for i in l:
...     if i[0] in d:
...             d[i[0]].append(i[1:])
...     else:
...             d[i[0]]=[i[1:]]
... 
>>> d
{'phone': [['500', 450.0, 1], ['500', 2250.0, 5]], 'laptop': [['600', 540.0, 1], ['600', 540.0, 1], ['600', 540.0, 1]], 'camera': [['200', 1080.0, 6]]}

Python中的字典与单词
Dictionary
的意思完全相同。这意味着,您可以直接使用关键字轻松地查找任何
关键字的
值。不幸的是,对于
列表
,这是不可能的,因为列表是以
数字
索引的。因此,建议首先将列表转换为字典,原因有二:
1:更容易将给定数据映射到
单个

2:处理数据值以获得所需的结果。

打印的结果所示,现在使用键(即使在循环中)访问任何数据都更容易了。例如,
要获得手机的价格
,您只需执行以下操作:
dictList['phone']['Price']
,这比执行类似于:
flatList[0][2]
这样的操作要简单得多,因为后者实际上并不那么直观

product_list    = [
    ['phone',  '500', 450.0,  1],
    ['phone',  '500', 2250.0, 5],
    ['camera', '200', 1080.0, 6],
    ['laptop', '600', 540.0,  1],
    ['laptop', '600', 540.0,  1],
    ['laptop', '600', 540.0,  1]
]

# CREATE A LIST OF DICTIONARY FROM GIVEN DATA FOR EASIER MAPPING
item        = ["product_name", "price_rate", "price", "quantity"]
dictList    = {}
for data in product_list:
    if data[0] not in dictList:
        dictList[data[0]]   = dict(zip(item, data))
    else:
        tmpD    = dict(zip(item, data))
        dictList[data[0]]["price"]      = float(dictList[data[0]]["price"]) + float(tmpD['price'])
        dictList[data[0]]["quantity"]   = float(dictList[data[0]]["quantity"]) + float(tmpD['quantity'])
        # dictList[data[0]]["price_rate"] = float(dictList[data[0]]["price_rate"]) + float(tmpD['price_rate'])

print(dictList)
## PRINTS:
## {
##  'phone':  {'product_name': 'phone',  'price_rate': '500', 'price': 2700.0, 'quantity': 6.0}, 
##  'camera': {'product_name': 'camera', 'price_rate': '200', 'price': 1080.0, 'quantity': 6}, 
##  'laptop': {'product_name': 'laptop', 'price_rate': '600', 'price': 1620.0, 'quantity': 3.0}
## }
但是,如果出于任何原因,您需要将数据作为列表,那么使用简单的
列表组合
也会非常容易,例如:

item        = ["product_name", "price_rate", "price", "quantity"]
dictList    = {}
for data in product_list:
    if data[0] not in dictList:
        dictList[data[0]]   = dict(zip(item, data))
    else:
        tmpD    = dict(zip(item, data))
        dictList[data[0]]["price"]      = float(dictList[data[0]]["price"]) + float(tmpD['price'])
        dictList[data[0]]["quantity"]   = float(dictList[data[0]]["quantity"]) + float(tmpD['quantity'])
        # dictList[data[0]]["price_rate"] = float(dictList[data[0]]["price_rate"]) + float(tmpD['price_rate'])

arrayList   = [ list(dVal.values()) for dKey, dVal in dictList.items() ]
print(arrayList)
## PRINTS:
## [
##     ['phone',  '500', 2700.0, 6.0], 
##     ['camera', '200', 1080.0, 6], 
##     ['laptop', '600', 1620.0, 3.0]
## ]

您可以在Python3中使用
itertools.groupby

import itertools
s = [['phone', '500', 450.0, 1], ['phone', '500', 2250.0, 5], ['camera', '200', 1080.0, 6], ['laptop', '600', 540.0, 1], ['laptop', '600', 540.0, 1],['laptop', '600', 540.0, 1]]
new_s = [(a, list(b)) for a, b in itertools.groupby(sorted(s, key=lambda x:x[0]), key=lambda x:x[0])]
final_s = [[a, b[0][1], *list(map(sum, list(zip(*[i[2:] for i in b]))))] for a, b in new_s]
输出:

[['camera', '200', 1080.0, 6], ['laptop', '600', 1620.0, 3], ['phone', '500', 2700.0, 6]]

请说明您想要的输出是什么,在这种情况下,“独特”可能意味着很多事情。。。是否要删除具有相同产品名称的所有项目?如果是的话,您如何处理其他同名项?@AntiMatterDynamite是的。我想要的输出是删除相同的产品名称并添加其他属性。第二个值会发生什么?它不是为手机添加的,
摄像头的值与列表中的值不同。如果你能解释为什么使用字典(就复杂性而言)比使用列表更好,那么你的答案会很好——因为现在它只假设OP需要它,但是他可能只需要返回一个列表。@OwlMax感谢您的反馈。将更新答案以考虑到这一点。…@Poiz感谢您的回答。我不一定需要数据在列表中,dictionary也可以完成这项工作,我也可以使用dictionary输出上一个函数中的数据。你的回答起作用了。