2013-01-14 24 views
9

你有一個數字列表,你想過濾掉那些包含唯一數字的數字,即每個數字只能出現在數字中一次。如何過濾包含唯一數字的數字?

正面的例子:

  • 58293.6
  • 0.1246

負例子:

  • 9585(5發生兩次)
  • 58293.666(6出現三次)
  • 0.12461(1發生兩次)

你會怎麼做呢?我自己的想法是將每個數字轉換爲一個字符串,然後檢查由該字符串的字符組成的集合的大小是否等於字符串的長度。類似的東西:

def uniques(numbers): 
    for number in numbers: 
     str_number = str(number) 
     if len(set(str_number)) == len(str_number): 
      yield number 

for i in uniques(xrange(1000, 1050)): 
    print i 

1023 
1024 
1025 
1026 
1027 
1028 
1029 
1032 
1034 
1035 
1036 
1037 
1038 
1039 
1042 
1043 
1045 
1046 
1047 
1048 
1049 

有沒有辦法做到這一點,而無需首先將整數轉換爲字符串?

+2

不要將其轉換回來。對數字的字符串化版本採取其他變量。 – Matthias

+0

特別是如果您的輸入包含'浮動'... –

+3

除此之外,我認爲您的方法很簡單易懂。我會和它一起去的。 –

回答

8

有沒有辦法做到這一點無需轉換整數轉換爲字符串 第一,然後將它們轉換回?

是的,你可以使用divmod找到數字基地10,但這不是比你張貼的方法快:

def uniques2(numbers): 
    for number in numbers: 
     seen = set() 
     quotient = number 
     while quotient > 10: 
      quotient, remainder = divmod(quotient, 10) 
      if remainder in seen: 
       break 
      else: 
       seen.add(remainder) 
     else: 
      yield number 
+0

+1。非常好。這正是我所期待的。在我的機器上,你的方法甚至比我的解決方案稍快。做得好。 :) – pemistahl

5

嘗試:

def predicate(n): 
    s = repr(n) 
    return len(s) == len(set(s)) 
filtered_numbers = [ n for n in numbers if predicate(n) ] 

或者,如果你喜歡過濾功能:

filtered_numbers = filter(predicate, numbers) 

或:

filtered_numbers = filter(lambda n: len(repr(n)) == len(set(repr(n))), numbers) 
+1

+1 for'lambda' :) –

+1

因此,使用'repr'而不是'str',這是相同的事情用不同的方式說 – Abhijit

+1

@Abhijit,repr(1.0/7.0)和str(1.0 /7.0)。 –

3

如果你想要一個基於正則表達式的解決方案,請考慮以下的正則表達式:

​​

即,如果沒有重複的數字並且沒有重複的小數點,則匹配數字和句點序列。

更新(感謝@frb):用Python寫這個正確的方法是

re.match(r"(?![\d.]*([\d.])[\d.]*\1)^[\d.]+$",str_number).group(0) 
+0

@frb IIUC,來源是一個數字_converted_到字符串,所以'1.1.1'不能出現。無論如何,'1.1.1'應該不匹配。如果你想抱怨,抱怨'1.2.3' –

+0

@frb'1.1.1'不符合:link:http://regexpal.com/?flags=g®ex=(%3F!%5B%5Cd。 %5D *(%5Cd)%5B%5Cd。%5D *%5C1)%5E%5B%5Cd。%5D%2B%24&input = 1.1.1)我不明白爲什麼Python應該不同,也不能試試吧 –

+0

@frb也許它需要一些轉義或'$ 1'而不是'\ 1'作爲反向引用?我是一個正則表達式的愛好者,而不是python-guru。 –

0

使用collections.Counter:

from collections import Counter 

def unique(seq): 
    return any(x > 1 for x in Counter(seq).values()) 

這將適用於任何序列,不僅是字符串。

只有現在我注意到,你不想轉換爲字符串...不知道爲什麼,但我會讓答案留下。

+0

-1。這不是我所要求的。請再讀一遍我的問題。 – pemistahl

相關問題