簡體   English   中英

我在弄清楚這個壓縮代碼時遇到麻煩

[英]I'm having trouble figuring out this condensed code

def duplicate_count(s):
    return len([c for c in set(s.lower()) if s.lower().count(c)>1])

我很難理解此代碼的工作方式。 我正在進行代碼戰挑戰,以返回字符串中重復的元素數量。

例如。 Asasd-> 2

我想出了自己的實現,但我無法真正理解此代碼的作用。 如果有人能指出我的方向,將不勝感激:)

首先,這是解決該問題的效率極低的解決方案。 但讓我們分解一下:

  • s.lower()會將字符串中的所有字符轉換為小寫:

     In [1]: s = "Hello, WORLD" In [2]: s.lower() Out[2]: 'hello, world' 
  • set(s.lower())將從字符串中創建一個字符 (確保了解什么是字符集)-消除所有重復項:

     In [3]: set(s.lower()) Out[3]: {' ', ',', 'd', 'e', 'h', 'l', 'o', 'r', 'w'} 
  • for c in set(s.lower())我們遍歷上面創建的集合中的每個單個字符
  • 對於此集合中的每個字符,我們將在if條件下應用此條件: if s.lower().count(c)>1 這里的count(c)將計算c在字符串中出現的次數。 >1可幫助我們在字符串中保留多次遇到的字符
  • [c for c in set(s.lower()) if s.lower().count(c)>1] 稱為列表推導 基本上,這是創建列表的一種簡短方法。 在這里,我們創建了一個字符列表,這些字符在一個字符串中出現多次。 查看有關如何表達和閱讀列表理解的主題
  • len()然后獲取列表的長度

總而言之,您遍歷給定字符串中的唯一字符,並計算其中哪些字符多次出現在字符串中。

set(s.lower()) # gives unique elements in lower case

s.lower().count(c)>1 #checks if an element shows up more than once

總之,該函數查找字符串中不唯一的元素的數量,而忽略大小寫。

我相信使用collections.Counter會更高效:

In [7]: from collections import Counter

In [8]: sum(v > 1 for v in Counter("Aabcc".lower()).values())

Out[8]: 2
def duplicate_count(s):

    result = []

    for c in set(s.lower()):
        if s.lower().count(c) > 1:
            result.append(c)

    return len(result)

暫無
暫無

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

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