[英]Using list comprehension and sets
創建並打印滿足以下條件的單詞列表:
例如,單詞“ballooned”應該包含在你的列表中,因為由奇數字母“blond”形成的單詞和由偶數字母“aloe”形成的單詞都在小寫單詞。 類似地,“三年”分裂為“輕微”和“腎臟”,兩者都在單詞列表中。
我的老師告訴我們,我們應該使用一套: s=set(lowers)
因為這會更快。
到目前為止我有什么:
s=set(lowers)
[word for word in lowers if len(word)>=8
and list(word)(::2) in s
and list(word)(::-2) in s]
我認為我沒有使用正確的設置。 有人可以幫助我讓這個工作
問題是你將word
轉換為列表(不必要),你的切片不在括號中(你使用括號),你的第二個切片使用錯誤的索引(應該是1::2
,而不是::-2
)。
以下是正確完成的切片:
>>> word = "ballooned"
>>> word[::2]
'blond'
>>> word[1::2]
'aloe'
請注意, s
是小寫單詞集合的奇數名稱。 一個更好的名字是words
。
你對set
使用是正確的。 你的老師希望你使用一組的原因是它的速度要快得多一組比它是一個列表的成員測試。
把它放在一起:
words = set(lowers)
[word for word in words if len(word) >= 8
and word[::2] in words
and word[1::2] in words]
以下是如何在列表理解中構建條件檢查的快速示例:
>>> word = 'ballooned'
>>> lowers = ['blond', 'aloe']
>>> s = set(lowers)
>>> len(word) >= 8 and word[::2] in s and word[1::2] in s
True
編輯:剛才意識到lowers
包含有效單詞和“搜索”單詞,如'ballooned'和'triennially',無論如何你應該能夠在列表理解中使用上述條件來獲得正確的結果。
list(word)(::2)
首先,訪問索引范圍的語法是使用平方括號,同樣,您不需要先將word
轉換為列表,您可以直接在字符串上執行此操作:
>>> 'ballooned'[::2]
'blond'
另外, [::-2]
不會給你不均勻的單詞,而是另一個單詞的反轉版本。 你需要使用[1::2]
(即跳過第一個,然后是第二個字符):
>>> 'ballooned'[::-2]
'dnolb'
>>> 'ballooned'[1::2]
'aloe'
一般來說,分別測試某些部件以確定它們是否真的按照您的想法行事總是一個好主意。
這應該這樣做:
s=set(lowers)
[word for word in lowers if len(word)>=8 and word[::2] in s and word[1::2] in s]
或使用all()
:
In [166]: [word for word in lowers if all((len(word)>=8,
word[::2] in s,
word[1::2] in s))]
使用[::]
not (::)
並且這里不需要list()
,加上用於放置在奇數位置的字母形成的單詞使用[1::2]
。
In [151]: "ballooned"[::2]
Out[151]: 'blond'
In [152]: "ballooned"[1::2]
Out[152]: 'aloe'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.