2014-07-16 3 views
0

리스트에 대해 반복 테스트를하고, 조건을 테스트하고, 조건이 만족 될 때 일치 된 값을 새로운 빈리스트에 추가하려고합니다. 조건이 처음 충족되면 일치하는 값은 새 목록 @ index 0에 추가되어야합니다. 두 번째로는 인덱스 1로 등등 문제는 새로운 목록에 포함 된 것과 동일한 색인에 추가된다는 것입니다 내가 반복하는 원래 목록에. 누구든지이 문제를 해결하는 방법을 알고 있다면 매우 감사하게 생각합니다! 다음을 표시 tweet_text리스트 반복 및 새로운리스트에 값 추가하기

for i in range(len(tweets)): #contains list of dictionaries 
    if tweets[i].get('text') is not None: 
     string = tweets[i].get('text') 
     tweet_text.append(re.findall(r"#(\w+)", string)) 

인쇄 :

[[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [u'easybranches', u'SEO', u'marketing', u'influence', u'social', u'leadership', u'brand', u'branding'], []] 
+0

정규 표현식이 아닌 매번 조건과 일치 할 가능성을 고려 했습니까? 또한 반복자를 통해 0에서 목록의 길이까지 반복하는 대신 목록을 반복하여 'tweet for tweet'을 사용하여 직접 반복 할 수 있습니다. – Ryan

+1

'findall'은 항상 목록을 반환합니다. 일치하는 항목이 없으면 빈 목록이 반환됩니다. 그래서 당신이 요구하는 것을하고 있습니다. 너는 무엇을하려고 했는가? – ssm

답변

1

re.findall는 항상 뭔가를 반환합니다. 일치하는 항목이 없으면 빈 목록을 반환합니다. 정규식이 일치하지 않을 때마다 빈 목록을 추가하고 있습니다.

for tweet in tweets: #contains list of dictionaries 
    text = tweet.get('text') 
    if text is not None: 
     matches = re.findall(r"#(\w+)", text) 
     # Test whether any matches were found 
     if matches: 
      tweet_text.append(matches) 

또한 get에 대한 빈 문자열 기본값을 사용하여 두 가지 조건을 축소 할 수 : 만 일치하는 항목이 발견 될 때 추가하려면

것은, 당신은 조건으로 테스트해야합니다 : 어떤 텍스트가없는 경우 get('text', '') 반환 빈 문자열을 사용

for tweet in tweets: #contains list of dictionaries 
    matches = re.findall(r"#(\w+)", tweet.get('text', '')) 
    if matches: 
     tweet_text.append(matches) 

; findall은 항상 작동하며 일치하는 항목이없는 경우 빈 목록을 반환합니다.

또한 루프를 변경했습니다. 인덱스를 반복 할 필요가 없습니다. 트윗을 tweets에 직접 반복합니다.

+0

'strs = [t.get ('text') 't'에 'text'가 있으면 트윗에있는 t에 대해, 그리고 나서이리스트를 사용하여'map '을 사용할 수도 있습니다. 또는 다음과 같은 것 :'t '의'텍스트 '인 경우 트윗의 t에 대한 t.get ('text ')의'for' – ssm