2017-07-30 24 views
1

所以基本上,我想這是False確定是否在列表中的任何兩個字符串具有相同字符開始功能

('click', 'bait', 'carrot', 'juice') 

而且這是True,因爲每串用不同的字符比開始其他人:

('click', 'bait', 'juice', 'silly') 

我得到的最接近的是以下,但它看起來不太好。

functools.reduce(lambda x, y: (y, x[0] != y[0]), map(operator.itemgetter(0), ('click', 'bait', 'carrot', 'juice')))[1] 

它失敗了,因爲它只檢查彼此相鄰的字符串。

回答

3
data = ('click', 'bait', 'carrot', 'juice') 

len(set(w[0] for w in data)) == len(data) 
# -> False 
+0

我最喜歡這個,它非常簡單! – bjd2385

1

這將做的工作:

l=('click', 'bait', 'carrot', 'juice') 
def f(l): 
    s=set() 
    for i in l: 
     if i[0] in s: 
      return False 
     s.add(i[0]) 
    return True 

設定s由到目前爲止,看到的第一個字母。在每次迭代中,移到下一個單詞並檢查第一個字母是否在s。如果它在那裏,則返回False。否則,您將第一個字母添加到s並繼續。該循環的優點是,如果第一個字母提前重複,則停止迭代並不繼續。從而避免不必要的工作

2

我按功能假設你的意思是沒有狀態變異。

any(n > 1 for n in collections.Counter(s[0] for s in ('click', 'bait', 'carrot', 'juice')).values()) 
+0

該做的伎倆! – bjd2385

+0

儘管......並不嚴格「功能性」......? – Tomalak

+0

@Tomalak是怎麼回事? –

相關問題