如果字典包含重复项,如何报告错误?

时间:2012-07-28 14:24:25

标签: python

我的代码类似于:

d = defaultdict(list)
for prod_no ,production in enumerate(productions):
    cp = Production(*productions[prod_no])
    count_yields = len(cp.pattern_list())
    #temp.setdefault(temp[cp.lhs()], []).append(count_yields)
    d[cp.lhs()].append(count_yields)

print d

作为输出,我得到的结论如下:

defaultdict(<type 'list'>, {'A': [3, 3, 4, 3], 'S': [1], 'B': [4,5]})

现在我需要报告错误,因为键'A'具有不同的多个值,如3和4.关于键'B'也可以这样说。

如果我得到像

这样的输出,应该没有任何错误
defaultdict(<type 'list'>, {'A': [3, 3, 3, 3], 'S': [1]})

因为'A'和'S'在整个......中都有相同的值。

4 个答案:

答案 0 :(得分:2)

如果要检查列表中的重复项(根据标题),可以将其转换为集合并检查其长度(在本例中为1):

if not all(len(set(items))==1 for items in d.values()):
    #A list against some key does not have all-same elements.

答案 1 :(得分:2)

如果您不想要重复值,则应使用sets而不是列表作为字典的值。在任何情况下,您都可以使用

检查重复值
dct = {'A': [4,3,3,3], 'S': [1]}
if any(len(v) != len(set(v)) for v in dct.values()):
   raise ValueError('Duplicate values in an item list')

答案 2 :(得分:0)

如果d是字典(它可以是包含默认字典的任何字典)。您可以使用以下代码。这将检查词典中的重复

for i in d.values():
    if len(set(i)) != len(i):
            print str(i) + " error"

答案 3 :(得分:0)

我不能在你的例子中弄清楚Python语法,所以我会根据两个不同的想法回答你。

您想要做什么取决于您何时想要这样做。例如,如果您想防止重复值,那么这是一种方法:

x_set = {'A':[4, 3]}
incoming_val = 3
if incoming_val in x_set['A']:
  print("The incoming value already present.")

如果要在错误报告后消除重复值,可以执行以下操作:

>>> x_set
{'A': [4, 3, 3]}
>>> list(set(x_set['A']))
[3, 4]
>>> 

您还可以将列表附加尝试放入try .. catch并发出异常信号并捕获它。这也是一个Pythonic的事情。