python 파이썬 - 목록에있는 하나 이상의 항목이 다른 목록에 있는지 확인하는 한 줄 짜기?





특수문자 입출력 (6)


이를 수행 할 수있는 많은 방법이 있습니다. 가장 직접적인 번역은 다음과 같습니다.

any_in = lambda a, b: any(i in b for i in a)

다음과 같이 세트와 관련된 여러 가지를 사용할 수도 있습니다.

any_in = lambda a, b: bool(set(a).intersection(b))

(해시 가능 요소의 요소에 따라 달라 지지만 사실이라면이 접근법 중 하나에 대해 ab 중에서 더 큰 집합을 만드는 것이 더 빠를 것입니다).

편집 : isdisjoint 는 Python 2.6 이상에서 intersection 하는 것보다 낫습니다. 그 사실을 알게되어 기쁘다. :)

이 질문에는 이미 답변이 있습니다.

내가 목록을 가지고 있다고하자 a=[1,2,3] 그리고 그 안에있는 숫자 중 적어도 하나가 다른 목록에 존재하는 지 알고 싶습니다 : b=[4,5,6,7,8,1] 즉, 목록 b 1,2,3가 있는지 알고 싶습니다. 이제 나는 뭔가를 할 수있다.

def func(a, b):
    for i in a:
       if i in b:
          return True
    return False

그러나 일을 깔끔하게 만들기 위해 한 줄에 넣을 수있는 방법이 있을까요?




Python 2.6 이상 :

def func(a, b):
  return not set(a).isdisjoint(b)

2.4 또는 2.5 :

def func(a, b):
  return len(set(a).intersection(b)) != 0

2.3 이하 :

sudo apt-get update
sudo apt-get upgrade

;)




간단한 하나의 라이너는 다음과 같습니다.

any(i in b for i in a)



목록을 집합으로 변환하면 집합 연산을 수행 할 수 있습니다. 교차가 0보다 큰 경우 적어도 하나의 요소가 일치해야합니다.

len(set(a) & set(b)) > 0



이것은 효과가있다.

def func(a, b):
    return any([i in b for i in a])



다음은 세 가지 솔루션입니다.

가장 빠른 방법은 for 루프를 사용하고 Dict에 저장하는 것입니다.

import time
from collections import Counter


def countElement(a):
    g = {}
    for i in a:
        if i in g: 
            g[i] +=1
        else: 
            g[i] =1
    return g


z = [1,1,1,1,2,2,2,2,3,3,4,5,5,234,23,3,12,3,123,12,31,23,13,2,4,23,42,42,34,234,23,42,34,23,423,42,34,23,423,4,234,23,42,34,23,4,23,423,4,23,4]


#Solution 1 - Faster
st = time.monotonic()
for i in range(1000000):
    b = countElement(z)
et = time.monotonic()
print(b)
print('Simple for loop and storing it in dict - Duration: {}'.format(et - st))

#Solution 2 - Fast
st = time.monotonic()
for i in range(1000000):
    a = Counter(z)
et = time.monotonic()
print (a)
print('Using collections.Counter - Duration: {}'.format(et - st))

#Solution 3 - Slow
st = time.monotonic()
for i in range(1000000):
    g = dict([(i, z.count(i)) for i in set(z)])
et = time.monotonic()
print(g)
print('Using list comprehension - Duration: {}'.format(et - st))

결과

#Solution 1 - Faster
{1: 4, 2: 5, 3: 4, 4: 6, 5: 2, 234: 3, 23: 10, 12: 2, 123: 1, 31: 1, 13: 1, 42: 5, 34: 4, 423: 3}
Simple for loop and storing it in dict - Duration: 12.032000000000153
#Solution 2 - Fast
Counter({23: 10, 4: 6, 2: 5, 42: 5, 1: 4, 3: 4, 34: 4, 234: 3, 423: 3, 5: 2, 12: 2, 123: 1, 31: 1, 13: 1})
Using collections.Counter - Duration: 15.889999999999418
#Solution 3 - Slow
{1: 4, 2: 5, 3: 4, 4: 6, 5: 2, 34: 4, 423: 3, 234: 3, 42: 5, 12: 2, 13: 1, 23: 10, 123: 1, 31: 1}
Using list comprehension - Duration: 33.0






python