2014-08-31 73 views
1

我收到一組字符串的另一個字符串結束。我將它轉換爲一個列表。如果列表中的任何字符串是列表中任何其他字符串的後綴,我需要返回值True。例如:憋屈通過列表迭代,並返回true當字符串從列表

測試= [ '你好', '羅', '他']

這應該因爲 '你好' 與 '羅' 結束返回True。

我嘗試這樣做:

for s in words_list: 
    if s.endswith(s, 0, len(words_list)): 
     return True 
    else: 
     return False 

此測試列表返回3個不同的價值觀之上,但我只需要一個返回值是報告真實,如果任何字符串是其他字符串和虛假後綴如果他們都不是。我怎麼能最好地完成這個?

謝謝!

+0

是否有原因返回True,但打印False? – SethMMorton 2014-09-01 00:04:27

回答

0

你需要每一個項目列表與列表中的每個其他項目相比,除了本身(因爲這會產生假陽性 - 這將永遠是正確的,因爲任何字符串在技術上是自己的後綴)。

所以,考慮到這一點,類似下面的東西應該工作。我測試了針對三種不同的輸入列表,其中包括一個不應該在所有的匹配(並且不):

#!/usr/bin/env python 

words_list = ['hello', 'lo', 'he'] 
words_list2 = ['narf', 'poit', 'troz'] 
words_list3 = ['narf', 'narfpoit', 'troznarf', 'zort'] 


def check_words(words_list): 
    print "#####" 

    for outer_num, outer_word in enumerate(words_list): 
     print "Outer word #{0}: {1}".format(outer_num, outer_word) 

     for inner_num, inner_word in enumerate(words_list): 
      print "Inner word #{0}: {1}".format(inner_num, inner_word) 

      if outer_num != inner_num: 
       if outer_word.endswith(inner_word): 
        print "True" 
        return True 
       else: 
        print "False" 

    return False 


result = check_words(words_list) 
print "result: {0}".format(result) 

result = check_words(words_list2) 
print "result: {0}".format(result) 

result = check_words(words_list3) 
print "result: {0}".format(result) 

這將產生以下的輸出:

##### 
Outer word #0: hello 
Inner word #0: hello 
Inner word #1: lo 
True 
result: True 
##### 
Outer word #0: narf 
Inner word #0: narf 
Inner word #1: poit 
False 
Inner word #2: troz 
False 
Outer word #1: poit 
Inner word #0: narf 
False 
Inner word #1: poit 
Inner word #2: troz 
False 
Outer word #2: troz 
Inner word #0: narf 
False 
Inner word #1: poit 
False 
Inner word #2: troz 
result: False 
##### 
Outer word #0: narf 
Inner word #0: narf 
Inner word #1: narfpoit 
False 
Inner word #2: troznarf 
False 
Inner word #3: zort 
False 
Outer word #1: narfpoit 
Inner word #0: narf 
False 
Inner word #1: narfpoit 
Inner word #2: troznarf 
False 
Inner word #3: zort 
False 
Outer word #2: troznarf 
Inner word #0: narf 
True 
result: True 

注:額外打印語句僅用於說明目的 - 這些可以被註釋掉。

0

對於每一個字 - 你可以遍歷list - word,看看是否有任何其他的話endswith()它:

words_list = ['hello', 'lo', 'he'] 
for s in words_list: 
    for word in words_list: 
     if word != s and word.endswith(s): 
      print s,word 
      break 
    else: 
     print False 

輸出

False 
lo hello 
False 
0

肯的回答是更完整的,因爲它會工作與列表(不只是元組),但這裏是另一種參考方法。

def words_overlap_endings(words_tuple): 

    return_value = False 
    for i, s in enumerate(words_tuple): 
     if s.endswith(words_tuple[:i]) or s.endswith(words_tuple[i+1:]): 
      return_value = True 

    return return_value 
0

在Python中最簡單的方法是使用any()。事實上,它甚至一個班輪:

any(x.endswith(y) for x in words_list for y in words_list if x!=y) 

欲瞭解更多信息,我建議查找列表中理解和生成器表達式。