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