簡體   English   中英

String包含列表的所有元素

[英]String contains all the elements of a list

我正在轉向Python,而且對pythonic方法仍然相對較新。 我想編寫一個帶字符串和列表的函數,如果列表中的所有元素都出現在字符串中,則返回true。


這似乎很簡單。 但是,我面臨一些困難。 代碼如下:


def myfun(str,list):
   for a in list:
      if not a in str:
         return False
      return True

Example : myfun('tomato',['t','o','m','a']) should return true
          myfun('potato',['t','o','m','a']) should return false
          myfun('tomato',['t','o','m']) should return true

此外,我希望有人可以在這里提出可能的正則表達式方法。 我也在試試他們。

>>> all(x in 'tomato' for x in ['t','o','m','a'])
True
>>> all(x in 'potato' for x in ['t','o','m','a'])
False
def myfun(str,list):
   for a in list:
      if not a in str:
         return False
   return True

return true必須在for循環之外,而不是在if語句之后,否則它將在檢查第一個字母后返回true。 這解決了你的代碼的問題:)

對於每個字母,您都要瀏覽列表。 因此,如果列表長度為n並且您有m字母,則復雜度為O(n*m) 如果你預處理這個詞,你可以達到O(m)

def myfun(word,L):
    word_letters = set(word) #This makes the lookup `O(1)` instead of `O(n)`
    return all(letter in word_letters for letter in L)

此外,將變量命名為strlist並不是一個好習慣,就像稍后需要創建list或使用str ,它們將被變量着色。

一些相關信息:

如果您不擔心重復字符,那么:

def myfunc(string, seq):
    return set(seq).issubset(string)

並且,未經測試,如果你關心重復的字符,那么可能(未經測試):

from collections import Counter
def myfunc(string, seq):
    c1 = Counter(string)
    c2 = Counter(seq)
    return not (c2 - c1)

為了好玩,我想我會用迭代器和地圖來做:

from operator import contains
from itertools import imap, repeat

def myfun(str, list):
    return all(imap(contains, repeat(str), list))

然后我意識到這基本上和接受的答案一樣,但可能有更多的方法調用。

def myfun(str, list):
    return all(letter in str for letter in list)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM