0

我的代码是这样的:

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

4 回答 4

2

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

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')
于 2012-07-28T14:39:26.287 回答
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.
于 2012-07-28T14:38:55.053 回答
0

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

for i in d.values():
    if len(set(i)) != len(i):
            print str(i) + " error"
于 2012-07-28T14:45:03.950 回答
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 的事情。

于 2012-07-28T14:47:08.340 回答