[英]How to find repeating strings one after the other?
最近開始自學Python,一直答不上這個問題:
"編寫一個 function 接收名稱列表(作為字符串)。function 返回列表中連續出現兩次且沒有重復的所有名稱的列表。例如,對於列表:["avi", " avi", "beni", "shlomo", "shlomo", "David", "haim", "moshe", "shlomo", "shlomo"] function 將返回Avi 和 Shlomo的列表。function 必須工作在 O (n) 中。”
這是我到目前為止所寫的,但我沒有成功:
def double_names(lst):
new_lst = []
for i in lst:
if lst[i] == lst[i+1]:
new_lst.append(i)
return new_lst
print(double_names(["avi", "avi", "beni", "shlomo", "shlomo", "David", "haim", "moshe", "shlomo", "shlomo"]))
我認為最簡單的方法是保存列表的第一個元素。 然后,您從第一個 position 開始遍歷列表,並檢查當前元素是否與您檢查的最后一個元素相同。 如果是,那么你有一個匹配項,如果不是,那么你只需更新最后一個元素並繼續。
def doublenames(l):
last = l[0]
new_list = []
for element in l[1:]:
if element == last:
if element not in new_list:
new_list.append(element)
else:
last = element
return new_list
希望它有所幫助:)
(你也可以一行完成:
[x[0] for x in set(zip(l, l[1:])) if (x[0] == x[1])]
)
保留一個變量previous_name
,它將存儲上一次迭代的名稱。
def double_names(names_list):
double_names = []
previous_name = None
for n in names_list:
if previous_name is not None:
if n == previous_name:
if n not in double_names:
double_names.append(n)
previous_name = n
return double_names
另一個解決方案:
lst = ["avi", "avi", "beni", "shlomo", "shlomo", "David", "haim", "moshe", "shlomo", "shlomo"]
def doublenames(L):
out = {}
for v in L:
out.setdefault(v, []).append(v)
return [v[0] for v in out.values() if len(v) > 1]
print(doublenames(lst))
印刷:
['avi', 'shlomo']
如果名稱的順序無關緊要,您可以使用集合來刪除重復項
def double_names(names):
from itertools import groupby
return list({key for key, group in groupby(names) if len(tuple(group)) >= 2})
print(double_names(["avi", "avi", "beni", "shlomo", "shlomo", "David", "haim", "moshe", "shlomo", "shlomo"]))
Output:
['shlomo', 'avi']
>>>
剛剛用 Python 3.8.2 試了一下,似乎順序沒有保留。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.