1

我是 Python 新手,必须通过反复试验来学习,但我无法找到解决我遇到的问题的方法。

我有一本看起来像这样的字典:

myDict = {'key1': ['item1', 'item2', 'item3'], 'key2': ['item4', 'item5', 'item6'],  
'key3': 'item7', 'key4': 'item8', 'key5': ['item1', 'item2', 'item3'], 'key6': 'item7'}

我需要从字典中删除重复值并将它们替换为空值(“”)。在这里找到了几个解决方案,但它们按预期工作

for key, value in myDict.items():
    if values not in key newDict.values():
        myDict[key] = value
    else:
        myDict[key] = ""
print newDict

这是删除所有值并输出

# newDict:{key1: '', key2: '', key3: '', key4: '', key5: '', key6: '')

我正在寻找输出

# newDict = {'key1': '', 'key2':['item4', 'item5', 'item6'], 'key3': '', 'key4':  
'item8', key5: ['item1', 'item2', 'item3'], 'key6': 'item7'}
4

2 回答 2

2

您的总体思路是正确的,但是您的代码存在三个问题:

  1. 您将值存储回myDict而不是 into newDict
  2. 在第 2 行,您正在检查values而不是value.
  3. 同样在第 2 行,key不应该在那里,并抛出一个SyntaxError.

这是正确的代码:

newDict = {}
for key, value in myDict.iteritems():
    if value not in newDict.values():
        newDict[key] = value
    else:
        newDict[key] = ""
print newDict

如果您不在反三元运算符阵营中,也可以将其缩短为:

newDict = {}
for key, value in myDict.iteritems():
    newDict[key] = value if value not in newDict.values() else ""
print newDict

或者,如果您宁愿从原始dict( myDict) 中删除值而不是构建新值 ( newDict),您可以这样做:

foundValues = []
for key, value in myDict.iteritems():
    if value not in foundValues:
        foundValues.append(myDict[key])
    else:
        myDict[key] = ""
print myDict

如果您需要按特定顺序删除重复值,请查看OrderedDicts

更新:

鉴于更新后的要求——从原来的值中删除值dict,从头开始——如果你能够简单地myDict用 aOrderedDict而不是 a进行初始化dict,你需要做的就是替换这个:

myDict = {'key1': ['item1', 'item2', 'item3'], 'key2': ['item4', 'item5', 'item6'], 'key3': 'item7', 'key4': 'item8', 'key5': ['item1', 'item2', 'item3'], 'key6': 'item7'}

有了这个:

from collections import OrderedDict

…

myDict = OrderedDict([('key1', ['item1', 'item2', 'item3']), ('key2', ['item4', 'item5', 'item6']), ('key3', 'item7'), ('key4', 'item8'), ('key5', ['item1', 'item2', 'item3']), ('key6', 'item7')])

然后使用上面提供的相同代码。

于 2013-08-15T18:31:02.703 回答
0

这样做:

myDict_values = myDict.values() # better than calling this numerous times
for key in myDict.keys():
    if myDict_values.count(myDict[key]) > 1: myDict[key] = ""

这不能保证key5它将是空白而不是key1,因为字典没有排序。

于 2013-08-15T15:08:10.537 回答