9

番号のリストがあり、一意の数字を含む番号を除外する必要があります。つまり、各数字は番号に1回だけ出現する可能性があります。

良い例:

  • 985
  • 58293.6
  • 0.1246

否定的な例:

  • 9585(5は2回発生します)
  • 58293.666(6回発生)
  • 0.12461(1は2回発生します)

どのようにそれをしますか?私自身の考えは、各数値を文字列に変換してから、文字列の文字で構成されたセットのサイズが文字列の長さと等しいかどうかを確認することです。そんな感じ:

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

最初に整数を文字列に変換せずにそれを行う方法はありますか?

4

4 に答える 4

9

最初に整数を文字列に変換してから元に戻すことなくそれを行う方法はありますか?

はい、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
于 2013-01-14T11:07:36.957 に答える
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)
于 2013-01-14T11:00:12.050 に答える
3

正規表現ベースのソリューションが必要な場合は、次の正規表現を検討してください。

(?![\d.]*([\d.])[\d.]*\1)^[\d.]+$

つまり、重複する数字がなく、重複する小数点がない場合は、一連の数字とピリオドを一致させます。

更新(@frbに感謝):Pythonでこれを書く正しい方法は

re.match(r"(?![\d.]*([\d.])[\d.]*\1)^[\d.]+$",str_number).group(0)
于 2013-01-14T11:03:03.813 に答える
1

collections.Counterの使用:

from collections import Counter

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

これは、文字列だけでなく、すべてのシーケンスで機能します。

そして今だけ、あなたが文字列に変換したくないことに気づきました...理由はわかりませんが、答えはそのままにしておきます。

于 2013-01-14T11:08:42.943 に答える