質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3643閲覧

Pythonで11や100など同じ数字を含む整数を数えたい

w_i_m_p

総合スコア9

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/07 13:33

前提・実現したいこと

ある整数の範囲内から「11,22,...,100,101,110,111,112,...」のように同じ数字が2回以上含まれるものだけをカウントしたいです。

該当のソースコード

例えば1〜90の範囲と5〜20の範囲のリストを入力して、数えた数を出力するコードです。

Python3

1arr = [[1,90],[5,20]] 2 3def countDigits(arr): 4 for i in arr: 5 visited = [0,0,0,0,0,0,0,0,0,0] 6 count = 0 7 count2 = 0 8 for j in range(i[0],i[1]+1): 9 if visited[j % 10] == 1: 10 count +=1; 11 visited[j % 10] = 1 12 count2 +=1 13 print(count2) 14countDigits(arr)

試したこと

上記コードですと、visitedがすべて1になったあとの整数も全てカウントしてしまうので
アプローチが間違っていると思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

a.py

python3

1def select_has_same_digit(a, b): 2 return list(filter(lambda x: len(list(str(x))) != len(set(str(x))), range(a, b + 1))) 3 4arr = [[1,90],[5,20]] 5 6arr_x = [select_has_same_digit(a, b) for (a, b) in arr] 7print(arr_x) 8print([len(s) for s in arr_x])

実行例

イメージ説明

str(x) で 整数 x を文字列に変換できます。
list(文字列) で、文字に分割した list を得られます。
set(文字列) で、重複を覗いた文字を列挙できます。
list(文字列) の長さと set(文字列) の長さが異なっていれば、同じ数字を含んでいたことになります。

このことをもとに、同じ数字を含む整数を数え上げるようにしています。

投稿2019/08/07 22:23

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

整数値を文字列として扱って、同じ数字が2つ以上含まれているかどうかで判定するのはどうでしょうか。
Listや文字列の要素(文字)をカウントするときは、 collections.Counter を使うと速くて便利です。
例えば、ある整数値がその条件を満たすかは、以下のようにかけると思います。
※ なんでこう書けるかは、一つずつ分解していってみてもらえばわかるかと思います。

python

1from collections import Counter 2 3def has_same_digits(n): 4 return Counter(str(n)).most_common(1)[0][1] > 1

Pythonの collections には他にも面白いものがたくさんあるので、時間があれば見てみると良いと思います。

https://docs.python.org/ja/3/library/collections.html


■ 追記1

一応この methodの引数は int しか取らない、というつもりで書きましたが、
文字列やスペースも来るというなら例えば以下のように書くと回避はできます。

def has_same_digits(n): return Counter([x for x in str(n) if x in "0123456789"]).most_common(1)[0][1] > 1

文字列としてではなく、あくまで数値として各桁の処理をしたい(例えば任意のk進数で使いたいとか?)という感じであれば、以下のような実装もあるかもしれません。
※ 10の部分を k に変えると、たぶん k進数で使える

def has_same_digits(n): assert isinstance(n, int) counts = [0] * 10 if n < 0: n = -n while n > 0: digit = n % 10 counts[digit] += 1 n = n // 10 return max(counts) > 1

■ 追記2
質問そのものに対して回答してなかったですが、
全体としては上記の has_same_digits() を使うと以下のように書けます。

def count_digits_in_ranges(range_list): for rng in range_list: print(sum([has_same_digits(n) for n in range(rng[0], rng[1])])) arr = [[1, 90], [5, 20]] count_digits_in_ranges(arr)

投稿2019/08/07 13:43

編集2019/08/07 14:54
mokemokechicken

総合スコア948

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

w_i_m_p

2019/08/07 14:14

ご回答ありがとうございます。 面白いですね。ただ、カンマを数えてしまったり、スペースを数えられたりするので、もしCounter以外の書き方がありましたら、ご教示いただけると幸いです。
w_i_m_p

2019/08/07 16:57

ありがとうございました。数値として扱いたかったので、追記で解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問