7

나는 파이썬에서 anagram 프로그램에 대한 사전을 가지고 일하고있다. 키는 정렬 된 문자의 튜플, 그리고 값은 그 편지와 함께 가능한 단어의 배열 인 : 나는 아래 목록을 필터링 할 정규식을 사용하고파이썬에서리스트의 사전을 좁히기

wordlist = { 
    ('d', 'g', 'o'): ['dog', 'god'], 
    ('a', 'c', 't'): ['act', 'cat'], 
    ('a', 's', 't'): ['sat', 'tas'], 
} 

.

filtered_list = { 
    ('a', 'c', 't'): ['act', 'cat'], 
    ('a', 's', 't'): ['sat'], 
} 

지금까지 내가 두 단계로 내려 왔 : 그래서 최종 결과가 있어야한다 필터로 r't$'을 부여.

tmp = {k: [w for w in v if re.search(r't$', w)] for k, v in wordlist.items()} 

이 빈리스트로 날 나뭇잎 :

:

다음
{ 
    ('d', 'g', 'o'): [], 
    ('a', 'c', 't'): ['act', 'cat'], 
    ('a', 's', 't'): ['sat'], 
} 

내가 두 번째 패스가 빈 목록을 제거 할 필요가 첫째, 표현식과 일치하는 모든 단어를 유지

filtered_list = {k: v for k, v in tmp.items() if v} 

나는 이것을 한 단계에서 할 수있는 방법이있을 것이라고 확신하지만, 아직 이해하지 못했습니다. 그들을 결합하는 방법이 있습니까? 또는 일반적으로 이것을하는 더 나은 방법?

+2

안녕하세요. 이것은 훌륭한 첫 번째 질문입니다. – shx2

+0

감사합니다. 내가 직접 모든 연구를했는지 확인하려고 노력했다. 저는 20 년 동안의 Perl 녀석이고, 저의 머리를 감싸고있는 이상한 파이썬 관용구가 있습니다. – phraktyl

답변

4

이 작업을 2 단계로 수행하면 문제가 없으며 가독성이 우수 할 수 있습니다.

하지만 질문에 답하기 위해 한 줄짜리 (여러 줄로 구분하여 읽기 쉽도록). 첫 번째 단계에서 쌍을 생성하기 위해 생성자 표현식을 사용합니다.

{ 
    k:v for k, v in 
    (
    (kk, [w for w in vv if re.search(r't$', w)]) 
    for kk, vv in wordlist.items() 
) 
    if v 
} 
=> {('a', 'c', 't'): ['act', 'cat'], ('a', 's', 't'): ['sat']} 
+1

이것은 내가 찾고 있었던 것이다. 우수한! 고맙습니다! 또한이 시점에서 매우 익숙하지 않은 목록 이해력 및 생성자에 대한 이해를 돕습니다. – phraktyl

+0

이 사전이 크다고 가정하면, python2에서'items' 대신에'iteritems'를 사용하는 것이 유용할까요? – SethMMorton

+0

@SethMMorton, 절대적으로. 파이썬 2에서는 거의 항상 그렇습니다. 왜냐하면 OP가 사용했던 것이고 특정 점은 질문과는 관련이 없기 때문에 나는 'items'를 사용합니다. – shx2

4

1 라이너의 경우 이와 비슷한?

A = {k:[w for w in v if re.search(r't$', w)] for k,v in wordlist.items() if any(re.search(r't$', w) for w in v)} 
+0

원래는> 1 줄로 나눌 것을 제안했지만 이것은 실제로 매우 읽기 쉽고 멋지다. – joc

+0

이것은 멋지게 보이지만 일치하는 단어가있을 경우 목록에있는 모든 단어가 포함 된 것처럼 보이는 것 같습니다. 여기에는 'sat'와 'tas'가 포함되어 있는데 'sat'만이 표현식과 일치합니다. – phraktyl

+0

키의 마지막 키가't'가되기를 원하십니까? – ysakamoto

관련 문제