あなたはこのようにネストされたリストの内包表記を使用することができます。
>>> m = ['abc','bcd','cde','def']
>>> r = [['abc','def'],['bcd','cde'],['abc','def','bcd']]
>>> [[1 if mx in rx else 0 for mx in m] for rx in r]
[[1, 0, 0, 1], [0, 1, 1, 0], [1, 1, 0, 1]]
また、あなたがint(...)
を使用して1 if ... else 0
を短縮することができ、あなたがr
のサブリストに変換することができますmx in rx
ルックアップがより高速になるように、に設定してください。
>>> [[int(mx in rx) for mx in m] for rx in r]
[[1, 0, 0, 1], [0, 1, 1, 0], [1, 1, 0, 1]]
>>> [[int(mx in rx) for mx in m] for rx in map(set, r)]
[[1, 0, 0, 1], [0, 1, 1, 0], [1, 1, 0, 1]]
int(...)
が1 if ... else 0
より少し短いですが、また、遅くなるようですので、あなたはおそらくそれを使用しないでください。繰り返し検索する前にr
のサブリストをset
に変換すると、リストが長くなるほど処理が速くなりますが、非常に短いリストのサンプルでは、実際には単純なアプローチよりも遅いです。 set
を使用して
長いリストでは
>>> %timeit [[1 if mx in rx else 0 for mx in m] for rx in r]
100000 loops, best of 3: 4.74 µs per loop
>>> %timeit [[int(mx in rx) for mx in m] for rx in r]
100000 loops, best of 3: 8.07 µs per loop
>>> %timeit [[1 if mx in rx else 0 for mx in m] for rx in map(set, r)]
100000 loops, best of 3: 5.82 µs per loop
は、予想されるように、速くなり:救助へ
>>> m = [random.randint(1, 100) for _ in range(50)]
>>> r = [[random.randint(1,100) for _ in range(10)] for _ in range(20)]
>>> %timeit [[1 if mx in rx else 0 for mx in m] for rx in r]
1000 loops, best of 3: 412 µs per loop
>>> %timeit [[1 if mx in rx else 0 for mx in m] for rx in map(set, r)]
10000 loops, best of 3: 208 µs per loop