Python 比较嵌套列表和编辑

Python 比较嵌套列表和编辑,python,nested-lists,Python,Nested Lists,对不起,如果这听起来像一个愚蠢的问题,但这个问题让我真的很困惑。我对python相当陌生,所以可能我遗漏了一些东西。我做了一些研究,但还没做太多。下面是: 我将使用一个简单的例子,使问题更清楚,我的数据不同,但格式和所需的操作是相同的。我们有一个关于人们和他们吃的比萨饼(以及其他一些数据)的数据库。然而,我们的数据库有多个相同的人的条目,他们有不同的比萨饼(因为我们合并了从不同比萨饼店获得的数据) 示例数据集: allData=['joe','32','pepperoni,cheese'],['

对不起,如果这听起来像一个愚蠢的问题,但这个问题让我真的很困惑。我对python相当陌生,所以可能我遗漏了一些东西。我做了一些研究,但还没做太多。下面是:

我将使用一个简单的例子,使问题更清楚,我的数据不同,但格式和所需的操作是相同的。我们有一个关于人们和他们吃的比萨饼(以及其他一些数据)的数据库。然而,我们的数据库有多个相同的人的条目,他们有不同的比萨饼(因为我们合并了从不同比萨饼店获得的数据)

示例数据集:

allData=['joe','32','pepperoni,cheese'],['marc','24','cheese'],['jill','27','veggie supreme,cheese'],['joe','32','pepperoni,veggie supreme']['marc','25','cheese chicken supreme']

我们注意到的几件事以及我想要遵循的规则:

  • 姓名可以出现多次,但在这种特定情况下,我们知道任何具有相同姓名的条目都是同一个人

  • 同一个人在不同的条目中的年龄可能不同,因此我们只需选择遇到的第一个年龄并使用它。示例
    marc
    的年龄是
    24
    ,我们忽略第二个条目中的
    25

我想编辑数据,这样一个人的名字只出现一次,他吃的比萨饼是所有同名条目中唯一的一组。如前所述,年龄只是第一次遇到。因此,我希望最终数据如下所示:

fixedData=[['joe'、'32'、'pepperoni、cheese、veggie supreme']、['marc'、'24'、'cheese、chicken supreme']、['jill'、'27'、'veggie supreme、cheese']

我在想一些关于:

fixedData = []
for i in allData:
    if i[0] not in fixedData[0]:    
        fixedData.append[i]
    else:
        fixedData[i[-1]]=set(fixedData[i[-1]],i[-1])
我知道我犯了好几个错误。你能给我指一下正确的方向吗


感谢堆。

因为名称是唯一的,所以在dict中使用它们作为键是有意义的,其中名称就是键。这将更适合您的情况:

>>> d = {}
>>> for i in allData:
    if i[0] in d:
        d[i[0]][-1] = list(set(d[i[0]][-1] + (i[-1].split(','))))
    else:
        d[i[0]] = [i[1],i[2].split(',')]


>>> d
   {'jill': ['27', ['veggie supreme', ' cheese']], 'joe': ['32', ['pepperoni', 'cheese', 'pepperoni', 'veggie supreme']], 'marc': ['24', ['cheese', 'cheese', 'chicken supreme']]}

在像您这样的情况下,我喜欢使用defaultdict。我真的很讨厌列表索引带来的猜测

from collections import defaultdict

allData = [['joe', '32', 'pepperoni,cheese'],
           ['marc', '24', 'cheese'],
           ['jill', '27', 'veggie supreme, cheese'],
           ['joe', '32', 'pepperoni,veggie supreme'],
           ['marc', '25', 'cheese,chicken supreme']]

d = defaultdict(dict)
for name, age, pizzas in allData:
    d[name].setdefault('age', age)
    d[name].setdefault('pizzas', set())
    d[name]['pizzas'] |= set(pizzas.split(','))

请注意使用设置我们遇到的第一个年龄值。它还支持使用set union获得独特的比萨饼。

这正是我所需要的。谢谢,不客气。唉,我已经达到了3333个代表点。。。谁会现在投票给我并毁掉这个独一无二的号码。。