簡體   English   中英

如何一個接一個地查找重復的字符串?

[英]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"]))

您的嘗試失敗,因為:

  1. 並不總是有一個列表元素i+1 (您可以使用zip(lst, lst[1:])代替)。
  2. 您沒有考慮到在您的結果中沒有名字應該出現兩次這一事實。 你可以為此使用一套。
  3. 您正在遍歷列表,同時期望獲得索引(您實際上會獲得列表項)。 謝謝,保羅

這樣的事情應該有效:

def double_names(lst):
    new_set = set()
    for first, second in zip(lst, lst[1:]):
        if first == second:
            new_set.add(first)
    return list(new_set)

我認為最簡單的方法是保存列表的第一個元素。 然后,您從第一個 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.

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