2011-03-31 27 views
3

与えられた整数の全要素対のリストを取得する最も簡単な方法は何ですか?与えられた整数の全要素対のリストを取得する最も簡単な方法は?

たとえば、f(20)[(1,20), (2,10), (4,5)]を返します。

def f(n): 
    from itertools import takewhile 
    if not isinstance(n,int): 
      raise ValueError("supplied %s type, requires integer input" %(type(n).__name__)) 
    return [(i,n/i) for i in takewhile(lambda x:x*x<n,xrange(1,n)) if (n%i)==0] 
+1

可能重複します(http://のstackoverflow。 com/questions/171765/what-is-the-the-best-way-to-a-numberの除数) –

+1

部分的に重複していますが、異なる質問です。 –

答えて

8
def f(value): 
    factors = [] 
    for i in range(1, int(value**0.5)+1): 
     if value % i == 0: 
      factors.append((i, value/i)) 
    return factors 

またはリストの内包表記を使用して同じこと:[?番号のすべての約数を取得するための最良の方法は何ですか]の

def f(val): 
    return [(i, val/i) for i in range(1, int(val**0.5)+1) if val % i == 0] 
+0

ハードコーディングされた係数を1に追加しました(%1の小さな点があります)。コードの厄介さと1未満の値を受け入れることができないことは、例外的にマイナーな最適化を上回っていますか? –

+0

1を0のファクタとして返すので、問題があります。これは「間違っています」。これは 'result = [(1、value)] *(value> 0)'を実行することで修正される可能性があります。 – Benjamin

+0

私は同意します。コードを修正します。 –

0

方法関数は負の整数(0と正の整数と同様に)のために働きます:

def f(n): 
    return [(i, n/i) for i in xrange(1, int(math.sqrt(math.fabs(n))) + 1) if n % i == 0] 

print f(-36) 
+0

2行目で不幸にするのは間違っています...(1) 'assert'は入力検証のためのものではなく、健全性チェックのためのものです。 (2)明示的な型検査は、とにかく悪い考えです。 (3)しかし、もしあなたがそれをしたら、少なくとも、isinstance(相続を考慮する)を使用してください。 (4)また、もし型がちょうど 'T'であるかどうかを確かめなければならないなら、型(...)がT' - ' is'である方がシングルトン(型は本質的に一つです) == '*は壊れた過負荷を持つ可能性があります。 – delnan

+0

mod(%)を使用するのではなく、(n/i)* i == nを行う理由は何ですか? –

+0

@ベンジャミン:整数除算ではなく、切り捨てられます。 Python 3では、 '/'が常に浮動小数点数を返すように変更されたので正しいですが。 – delnan

3

またはこの:

def f(n): 
    return [(i, n/i) for i in xrange(1, int(n**0.5) + 1) if n % i == 0] 

print f(36) 

EDIT2:または、ワンライナー使用して、リストの内包表記で:EDIT

def f(n): 
     factors_list = [] 
     for i in xrange(1, int(n**0.5) + 1): 
      if n % i == 0: 
       factors_list.append((i, n/i)) 
     return factors_list 

print f(20) 

したい場合は、この程度

+0

なぜ 'xrange'と' ceil'ですか? –

+0

@odonnell:大量のコードを使うときには速度を上げるために 'xrange'を使います(Python 3では必要ありません)、明快さと簡潔さのため' ceil'です。 – Benjamin

+0

factor_listから整数平方根を削除しないでしょうか?あなたはそれに1を加える必要があります。 – TheDude

関連する問題