很抱歉,如果这听起来像一个愚蠢的问题,但这个问题让我感到非常困惑。我对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
我想编辑数据,以便一个人的名字只显示ONCE,他吃的披萨是所有具有相同名称的条目的唯一集合。如前所述,年龄只是遇到的第一个。因此,我希望最终数据看起来像这样:
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])
我知道我犯了几个错误。请你指点我正确的方向吗?
谢谢你。
答案 0 :(得分: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']]}
答案 1 :(得分:0)
在像你这样的情况下我喜欢使用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(','))
注意使用setdefault来设置我们遇到的第一个年龄值。它还可以使用set union来获得独特的比萨饼。