0

这是一个作业(尽管完全颠倒了,所以我仍然必须考虑提供的任何解决方案并在这里实际学习一些东西......)并且我花了过去三个小时在网络上做各种教程并翻阅Python 手册、Daniweb 和此处,只是无法弄清楚如何综合这些概念。

我有一堆来自文本文件的输入(假设它是下面的),每行的第一项将变成字典的键,后三项进入一个“水果”类正如你想象的那样,最终描述了这些事情。

lemon?yellow?sour?not
lemon?yellow?sour?yes
orange?orange?sweet?yes
grape?purple?sweet?yes

我希望从此文件创建的键“柠檬”将描述符“黄酸不”和“黄酸是”作为列表返回。

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]

到目前为止,所有这些都有效,当然除了文件第二次点击“柠檬”键时,它会用“黄酸是”覆盖“黄酸不”(换句话说,它似乎正在做它应该做的一切去做。)

所以我正在研究一种解决柠檬问题的方法。我试过了:

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.

提前致谢!

4

2 回答 2

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)
于 2013-04-27T03:21:17.587 回答
0

而不是字典将关键字(例如“柠檬”)映射到列表,而是将其映射到 aset和 have("yellow", "sour", "not")("yellow", "sour", "yes")作为 atuple而不是您的Fruit类,并将它们添加到 set 对象。

该套装将确保您只保留独特的物品。如果稍后您发现出于某种原因需要将它们作为列表,则只需调用list(my_dict["lemon"])

如果您坚持使用自定义类,请考虑通过在您的类中定义方法来使您的Fruit类可散列。__hash__您可以通过简单地将值(“黄色”等)聚合到一个元组中并在__hash__调用时返回该元组的哈希值来在您的类中执行此操作。只是一种快速而肮脏的方法。如果它们不一定是字符串(例如“Yellow”等)并且可能是更复杂的数据类型,您可能想要研究更好的方法来为您可能存储的任何值创建哈希值。

请注意,添加到集合中的值不能是列表,因为列表不可散列。这就是为什么我建议一个元组(或__hash__为你的类定义一个方法)。

此外,您可能会发现字典对象中的setdefault()get()方法很有用。我建议在 python 文档或谷歌中查找它们。

于 2013-04-27T02:55:11.440 回答