这是为了一项任务(虽然完全转向了我的头,所以我仍然需要思考所提供的任何解决方案,并在这里学到一些东西......)并且我花了最后三个小时做各种教程网络和翻阅Python手册,Daniweb,在这里,只是无法弄清楚如何综合这些概念。
我有一堆来自文本文件的输入(让我们在下面说出来),每行的第一项将变成字典的关键字,后三个项目进入了一个班级' Fruit'最终描述的东西,正如你想象的那样。
lemon?yellow?sour?not
lemon?yellow?sour?yes
orange?orange?sweet?yes
grape?purple?sweet?yes
我喜欢钥匙"柠檬"从这个文件创建,以返回描述符"黄色酸不" AND"黄酸是"作为清单。
class Fruit(object):
'''Describes fruits'''
def __init__(self,color,flavor,tasty):
self.color = color
self.flavor = flavor
self.tasty = tasty
def getColor(self): return self.color
def getFlavor(self): return self.flavor
def getTasty(self): return self.tasty
def description(self): return self.color,self.flavor,self.tasty
fruity = {}
for line in inputFile:
n,c,f,t = line.split('?')
indFruit = fruit(c,f,t)
fruity[n] = [fruit.description]
到目前为止,所有这些都有效,当然除了第二次文件击中密钥" lemon"它覆盖了黄色的酸不是"用"黄酸是" (换句话说,如果写的话似乎正在做它应该做的所有事情。)
所以我正在努力解决柠檬问题。我试过了:
fruity = {}
fruitlist = []
for line in inputFile:
n,c,f,t = line.split('?')
indFruit = fruit(c,f,t)
fruity[n] = fruitlist.append(indFruit)
产生
{(lemon): none, (orange): none, (grape): none}
然后
fruity = {}
fruitlist = []
for line in inputFile:
n,c,f,t = line.split('?')
indFruit = fruit(c,f,t)
fruitlist.append(indFruit)
fruity[n] = fruitlist
它产生了一些超级成就者:
{(lemon): [(yellow, sour, not),(yellow,sour,yes),(orange,sweet,yes),(grape,sweet,yes)}
我无法弄清楚如何让它做我想做的事,即显示:
{(lemon): [(yellow, sour, not),(yellow,sour,yes)], (orange): [(orange, sweet, yes)]}
and so on.
提前致谢!
答案 0 :(得分:0)
而不是将关键字(例如“lemon”)映射到列表的字典,而是将其映射到set
并将("yellow", "sour", "not")
或("yellow", "sour", "yes")
作为tuple
而不是您的list(my_dict["lemon"])
Fruit 类并将它们添加到set对象。
该套装将确保您只保留唯一的商品。如果您以后发现由于某种原因需要将它们作为列表,那么只需调用__hash__
如果您坚持使用自定义类,请通过在类中定义__hash__
方法来研究使 Fruit 类可以使用。您可以通过简单地将值(“黄色”等)聚合到元组中并在调用__hash__
时返回该元组的哈希值来在您的类中执行此操作。只是一个快速而肮脏的方法。您可能希望研究更好的方法来为您可能存储的任何值创建哈希,如果它们不一定是字符串,如“黄色”等,可能是更复杂的数据类型。
请注意,添加到集合中的值不能是列表,因为列表不可清除。这就是我为你的班级建议一个元组(或定义{{1}}方法)的原因。
此外,您可能会发现字典对象中的 setdefault()和 get()方法很有用。我建议在python文档中查找它们或谷歌搜索它们。
答案 1 :(得分:0)
这是你的最后一行:
fruity[n] = fruitlist
这是将fruity [n]的值设置为整个列表。我猜你想要做一些像使用默认字典的事情,所以你可以为每个水果获得一个单独的列表(你也可以使用setdefault
,但为什么不能更具可读性?)
from collections import defaultdict
fruity = defaultdict(lambda : []) # new list for each item
#... at the end of your forloop
fruity[n].append(indFruit)
查看defaultdict上的文档了解更多信息。创建自己的defaultdict或将最后一行切换为:
也很简单 fruity.setdefault(n, [])
fruity[n].append(indFruit)