Python 将dict值转换为集合,同时保留dict

Python 将dict值转换为集合,同时保留dict,python,dictionary,set,Python,Dictionary,Set,我有这样一句话: (100002: set(['APPLE','MEDIUM','ROUND','RED']), 100004: set(['Banana','MEDIUM','LONG','YELLOW']), 100005: set(['CARROT','MEDIUM','LONG','ORANGE']) MyDict = {} infile = open('FileWithTheData.csv', 'r') for line in infile.readlines(): spl

我有这样一句话:

(100002: set(['APPLE','MEDIUM','ROUND','RED']), 100004: set(['Banana','MEDIUM','LONG','YELLOW']), 100005: set(['CARROT','MEDIUM','LONG','ORANGE'])
MyDict = {}
infile = open('FileWithTheData.csv', 'r')
for line in infile.readlines():
    spl_line = line.split(',')
    if int(spl_line[0]) in itemidlist: #note that this is the list I was formerly zipping together with a corresponding list of names to make my dict
        MyDict.setdefault(int(spl_line[0]), list()).append(spl_line[1:])
print MyDict
(100002:‘苹果’,100004:‘香蕉’,100005:‘胡萝卜’)

我正试图使我的dict对键有int(现在是这样),但对值有设置(而不是现在的字符串)。我的目标是能够从.csv文件中读取一列键(int是项目id号),然后读取大小、形状和颜色等列。我想将此信息添加到我的dict中,以便只添加dict中已有的密钥信息

我的目标宣言可能是这样的:

(100002: set(['APPLE','MEDIUM','ROUND','RED']), 100004: set(['Banana','MEDIUM','LONG','YELLOW']), 100005: set(['CARROT','MEDIUM','LONG','ORANGE'])
MyDict = {}
infile = open('FileWithTheData.csv', 'r')
for line in infile.readlines():
    spl_line = line.split(',')
    if int(spl_line[0]) in itemidlist: #note that this is the list I was formerly zipping together with a corresponding list of names to make my dict
        MyDict.setdefault(int(spl_line[0]), list()).append(spl_line[1:])
print MyDict
从我的dict(条目名为just key+string)开始,我尝试使用如下代码从.csv文件中读取额外信息:

infile = open('FileWithTheData.csv', 'r')
for line in infile.readlines():
    spl_line = line.split(',')
    if int(spl_line[0]) in MyDict.keys():
        MyDict[int(spl_line[0])].update(spl_line[1:])
不幸的是,这个错误是说
AttributeError:'str'对象没有属性“update”
。我尝试将字典中的值更改为集合,这样我就可以更新它们了。结果如下:
(100002:set(['A','P','L','E',]),100004:set(['B','A','N',]),100005:set(['C','A','R','O','T')
我想将这些值转换为一个集合,这样当前值的字符串将成为集合中的第一个字符串,而不是将字符串拆分为字母并生成这些字母的集合

在创建dict时,我还尝试通过将两个列表压缩在一起来设置值,但似乎没有任何区别。像这样的 MyDict=dict(zip(listofkeys,set(listofnames))) 仍然将整个listofnames列表设置为一个集合,但这并没有实现我的目标,即将MyDict中的每个值设置为一个集合,并将listofnames中的对应字符串作为集合中的第一个字符串

如何将MyDict中的值设置为一个集合,以便在不将当前dict中的值转换为一组单个字母的情况下向该集合添加其他字符串

编辑: 目前,我使用一个函数生成项目ID列表(即键),另一个函数查找这些项目ID以生成相应项目名称列表(使用两列.csv文件作为数据源),然后将它们合并在一起,从而生成MyDict

答复: 根据这里的建议,我提出了这个解决方案。我发现包含set()).update的部分可以很容易地更改为list()).append以生成一个列表而不是一个集合(这样可以保留顺序。)我还发现,通过将包含名称的列添加到带有data.csv的文件中来更新by.csv数据输入文件更容易,这样我就不必乱写dict了,将值转换为集合,然后添加更多数据。我的此部分代码现在如下所示:

(100002: set(['APPLE','MEDIUM','ROUND','RED']), 100004: set(['Banana','MEDIUM','LONG','YELLOW']), 100005: set(['CARROT','MEDIUM','LONG','ORANGE'])
MyDict = {}
infile = open('FileWithTheData.csv', 'r')
for line in infile.readlines():
    spl_line = line.split(',')
    if int(spl_line[0]) in itemidlist: #note that this is the list I was formerly zipping together with a corresponding list of names to make my dict
        MyDict.setdefault(int(spl_line[0]), list()).append(spl_line[1:])
print MyDict

您的错误是因为最初您的
MyDict
变量将整数映射为字符串。当您试图更新它时,您将该值视为一个
集,
当它是一个字符串时

为此,您可以使用一个:

combined_dict = defaultdict(set)

# first add all the values from MyDict
for key, value in MyDict.iteritems():
    combined_dict[int(key)].add(value)

# then add the values from the file
infile = open('FileWithTheData.csv', 'r')
for line in infile.readlines():
    spl_line = line.split(',')
    combined_dict[int(sp_line[0])].update(spl_line[1:])

您的问题在于如何初始化MyDict,请尝试将其更改为以下内容:

MyDict = dict(zip(listofkeys, [set([name]) for name in listofnames]))
下面是一个简单的差异示例:

>>> listofkeys = [100002, 100004, 100005]
>>> listofnames = ['APPLE', 'BANANA', 'CARROT']
>>> dict(zip(listofkeys, set(listofnames)))
{100002: 'CARROT', 100004: 'APPLE', 100005: 'BANANA'}
>>> dict(zip(listofkeys, [set([name]) for name in listofnames]))
{100002: set(['APPLE']), 100004: set(['BANANA']), 100005: set(['CARROT'])}
set(listofnames)
只是将您的列表转换为一个集合,可能产生的唯一效果是对上述值重新排序。实际上,您希望获取列表中的每个字符串值,并将其转换为一个元素集,这就是列表理解的作用


进行此更改后,当前代码应该可以正常工作,尽管您可以直接在字典上执行包含检查,而不是显式检查键(
key in MyDict
key in MyDict.keys()相同)。

请说明如何创建
MyDict
变量。我得到:line\u id,line_values=line.split(','1)^SyntaxError:无效语法抱歉,我已修复了它。您可能是指MyDict.items()中的
或MyDict.iteritems()中的
。这不仅仅回答了我的问题!我选择了简化您所介绍的内容,但很高兴知道这一点,以防我最终需要在其他地方做类似的事情
setdefault
也起到了相当大的作用。很高兴知道这一点以供将来参考,但现在我看到了Nathan Villaescusa的一个方法,它不必担心将值转换为单个字符串集,我想我将使用他的方法。不过,这确实回答了我的问题:如果我决定需要,如何进行转换:)