2012-10-20 113 views
1

我有兩個列表,我試圖查看兩個列表中的元素中的子字符串是否有匹配。交叉匹配兩個列表

["Po2311tato","Pin2231eap","Orange2231edg","add22131dfes"] 
["2311","233412","2231"] 

如果元素中的任何子字符串與第二個列表匹配,例如「Po2311tato」將與「2311」匹配。然後,我想將「Po2311tato」放入一個新列表中,其中第一個匹配的所有元素將被放置在新列表中。因此,新的清單將是[ 「Po2311tato」, 「Pin2231eap」, 「Orange2231edg」]

回答

5

您可以使用語法'substring' in string做到這一點:

a = ["Po2311tato","Pin2231eap","Orange2231edg","add22131dfes"] 
b = ["2311","233412","2231"] 

def has_substring(word): 
    for substring in b: 
     if substring in word: 
      return True 
    return False 

print filter(has_substring, a) 

希望這有助於!

+0

我認爲如果你打算使用這個函數,你也應該把b傳遞給函數,所以它更一般 – PyNEwbie

0
import re 

list1 = ["Po2311tato","Pin2231eap","Orange2231edg","add22131dfes"] 
list2 = ["2311","233412","2231"] 
matchlist = [] 

for str1 in list1: 
    for str2 in list2: 
     if (re.search(str2, str1)): 
      matchlist.append(str1) 
      break 

print matchlist   
2

這可以通過使用列表理解一點比jobby的回答更簡潔:

>>> list1 = ["Po2311tato","Pin2231eap","Orange2231edg","add22131dfes"] 
>>> list2 = ["2311","233412","2231"] 
>>> list3 = [string for string in list1 if any(substring in string for substring in list2)] 
>>> list3 
['Po2311tato', 'Pin2231eap', 'Orange2231edg'] 

不管這是不是更清晰/比jobby的版本更優雅是口味的問題!

+0

如果列表2是這樣的[「asd2311」,「asge233412」,「ora2231」] – user1756030

+1

那麼,list3將作爲一個空列表出現,因爲在這種情況下,list2的任何成員都不是list1的任何成員的子串。您可以通過命令行解釋器輕鬆測試這些東西。 –