【问题标题】:How to report an error if an element is missing in the list of lists如果列表列表中缺少元素,如何报告错误
【发布时间】:2012-08-02 04:43:20
【问题描述】:

假设

list1 = [['a', (1, 1)], ['a', (1, 3)], ['a', (1, 4)], ['b', (2,1)], ['b', (2,2)], ['b',(2, 4)]]

list2 = [[(1, 1), (1, 3), (2, 1), (2, 2), (2, 4)]]

现在我该如何报告 list1 缺少 ['b', (1, 2)] 或 ['b', (2, 3)] 缺失的错误

同样对于list2应该有(1, 2)或者(2, 3)缺失的报错

我的意图是报告错误,例如,如果缺少某些东西,例如 (1,1) 然后是 (1,2),然后是 (1,3),如果缺少 (1,2) 然后是错误

【问题讨论】:

  • 缺少元素的标准是什么?
  • (1,1),(1,2),(1,3)... 应按顺序排列...如果缺少任何一个,则应以类似方式报告错误 (2 ,1),(2,2),(2,3)..
  • 所以你只想确保每个给定val[0] 的子序列在最小val[1] 和最大val[1] 之间的每个val[1] 都有一个val?如果val[0] 不连续怎么办?另外,你为什么不使用list1 的字典?
  • 另外,如果您发现重复项应该怎么办(例如 list2 包含 2 个元素 (1, 2))。
  • 这是作业吗?如果是,那么请标记它。谢谢!

标签: python


【解决方案1】:

您应该使用字典而不是列表。但这是使用您的结构的解决方案。 s1 与上一个答案的想法相似,但请注意不必要的长列表理解以获得list1 中的模式。而且您需要一个特定的 for 循环来检查,而不是设置“-”运算符。

>>> s1 = [[x, (c, d)] for x in ['a', 'b']
...                   for c in range(1, 3)
...                   for d in range(1, 5)
...                   if x=='a' and c==1 or x=='b' and c==2]
>>> s1
[['a', (1, 1)], ['a', (1, 2)], ['a', (1, 3)], ['a', (1, 4)],
 ['b', (2, 1)], ['b', (2, 2)], ['b', (2, 3)], ['b', (2, 4)]]
>>>
>>> list1 = [['a', (1, 1)], ['a', (1, 3)], ['a', (1, 4)],
...          ['b', (2, 1)], ['b', (2, 2)], ['b', (2, 4)]]
>>> for thing in s1:
...     if thing not in list1:
...         print 'missing: ', thing
...         # or raise an error if you want
...         
missing:  ['a', (1, 2)]
missing:  ['b', (2, 3)]

list2 重复相同的操作。使用上面s1 的示例应该更容易创建s2

顺便说一句,list1 的字典看起来像这样:

dict1 = {'a': [(1, 1), (1, 3), (1, 4)], 'b': [(2, 1), (2, 2), (2, 4)]}

然后创建 s1 稍微简化了一点,但是比较循环可能会长两行。


概括回答您的问题,然后1.先知道字母还是2.知道数字/字母数量? p>

识字:

>>> set_of_letters = ('a', 'b', 'c')
>>> s1 = [[x, (ord(x)-96, d)]
...       for x in set_of_letters
...       for d in range(1, 5)]
>>> s1
[['a', (1, 1)], ['a', (1, 2)], ['a', (1, 3)], ['a', (1, 4)],
 ['b', (2, 1)], ['b', (2, 2)], ['b', (2, 3)], ['b', (2, 4)],
 ['c', (3, 1)], ['c', (3, 2)], ['c', (3, 3)], ['c', (3, 4)]]

认识数字:

>>> number_of_letters = 3
>>> s1 = [[chr(c+96), (c, d)]
...       for c in range(1, number_of_letters + 1)
...       for d in range(1, 5)]
>>> s1
[['a', (1, 1)], ['a', (1, 2)], ['a', (1, 3)], ['a', (1, 4)],
 ['b', (2, 1)], ['b', (2, 2)], ['b', (2, 3)], ['b', (2, 4)],
 ['c', (3, 1)], ['c', (3, 2)], ['c', (3, 3)], ['c', (3, 4)]]

【讨论】:

  • 如果我有 c, d, e...这意味着我的列表将是 [['a', (1, 1)], ['a', (1, 3)] , ['a', (1, 4)], ['b', (2,1)], ['b', (2,2)], ['b',(2, 4)],[ 'c',(3,1)], ('c', (3,4)),['d', (4,1)], ['d', (4,2)] ,['d ', (4,4)]]。我正在寻找一个更通用的解决方案来解决这个问题
  • 提示:ord('a')-96 == 1。所以你是说,在[[x, (c, d)] 中,c 总是 1 代表“a”,2 代表“b”,等等?
  • 我添加了用于创建s1 的“概括”。 for 的检查循环保持不变。
  • 我的意思是说这个序列并不仅仅局限于 a b 或 c...它可以是 d、e、f 等。每个 'a' 、 'b' 或 'c ' 或任何可能具有序列的东西,这意味着我们可以将其附加到列表 ['c', (3,1)], ['c', (3,3)] 之后,然后是 ['d', ( 4, 1)], ['d',(4,2)], ['d', (4,4)] 等等...最后我们要报错 if ['d',(4 ,3)] 或 'c',(3,2) 丢失..
  • 然后将您的list1 转换为我在帖子中最初提到的字典。然后将具有“集合”的每个字母“键”与固定集合进行比较会更容易。因此,与其添加列表,不如创建自己的函数来取出字母并将其添加到dict1,使其看起来像dict1 = {'a': [(1, 1), (1, 3), (1, 4)], 'b': [(2, 1), (2, 2), (2, 4)]}
【解决方案2】:
from collections import defaultdict
set1 = set(list1)
set2 = set(list2)
missing = []
dict1 = defaultdict(lambda: defaultdict(list))
dict2 = defaultdict(list)
for key, sublist in set1:
    dict1[key][sublist[0]].append(sublist[1])
for key, value in set2:
    dict2[key].append(value)
for key, subdict in sorted(dict1.iteritems()):
    for subkey, values in sorted(subdict.iteritems()):
        subkey_misses = []
        last_value = None
        for value in values:
            if last_value is not None and last_value + 1 != value:
                subkey_misses.extend(range(last_value + 1, value))
            last_value = value
        if subkey_misses:
            misses.append('%s.%d missing %s' % (key, subkey, subkey_misses))
for key, values in sorted(dict2.iteritems()):
    key_misses = []
    last_value = None
    for value in values:
        if last_value is not None and last_value + 1 != value:
            key_misses.append(range(last_value + 1), value))
        last_value = value
    if key_misses:
        misses.append('%d missing %s' % (key, key_misses))
print misses

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 2020-06-18
    • 2012-01-06
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多