0

仮定する

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)]]

['b', (1, 2)] が見つからない、または ['b', (2, 3)] が見つからないという list1 のエラーを報告するにはどうすればよいでしょうか。

同様に、list2 の場合、(1, 2) または (2, 3) が欠落しているというエラーが報告されるはずです。

私の意図は、たとえば、(1,1) のような順序で何かが欠落している場合、(1,2) が欠落している場合に (1,3) が続き、エラーが発生した場合にエラーを報告することです。

4

2 に答える 2

0

リストの代わりに dict を使用する必要があります。しかし、ここにあなたの構造を使った解決策があります。s1前の回答と同様のアイデアですが、 にあるパターンを取得するために不必要に長いリスト内包表記に注意してくださいlist1-また、 set " " 演算子ではなく、特定の 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ます。上記の例を使用すると、作成s2が簡単になるはずですs1

ところで、辞書は次のようになりますlist1

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

次に、s1 の作成は少し単純化されますが、比較ループが 2 行長くなる可能性があります。


一般化する質問に答えるには、1.最初に文字を知っているか、2.数字/文字数を知っていますか?

文字を知っている:

>>> 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)]]
于 2012-08-01T17:04:16.343 に答える
0
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
于 2012-08-01T20:43:20.410 に答える