リストの代わりに 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)]]