2017-09-19 5 views
2

問題は次のとおりです。のpython - 次のように共通の要素を共有しない戻り番号は

2つの入力、数nとリストlstを取る関数を作成します。 この関数はlstにある のすべての数値のリストを返します。n(1以外)に共通の要素はありません。

def no_common_factors (n, lst): 

    def uf(n): #get a set of factors 
     factors = [] 
     i = 2 
     while n > 1: 
      if n % i == 0: 
       factors += [i] 
       n = n/i 
      else: 
       i += 1 
     return set(factors) 

    factors_n = uf(n) 
    no_common = [] 

    for i in range(0, len(lst)): 
     factors_i = uf(i) 
     if factors_n.isdisjoint(factors_i): 
      no_common += [lst[i]] 
     else: 
      continue 

    return no_common 

が動作しない nと、 lst内のすべての数値は0

私の試みに正の整数が以上になります。

In [41]: no_common_factors(15, [72,27,32,61,77,11,40]) 
Out[41]: [72, 27, 32, 77] 

それは返すべきです[ 32,61,77,11]。

私はそれを見つめているが、私が間違っていることを見ることができない、それは本当に簡単だと思われる。助けてください!

+1

実際の数値ではなく、反復変数「i」の要素をチェックしています。 'uf(lst [i])'を実行するか、lstのxの数値自体をよりよく反復する: ' – Felk

+0

関数内に関数を持つのは共通のことですか?私には奇妙に見えます。 – offeltoffel

+0

@Felk、ありがとう! –

答えて

3

あなたの不具合は、factors_iの計算で出ました。

置き換えます

factors_i = uf(i) 

で:

def no_common_factors(n, lst): 
    factors_n = uf(n) 
    no_common = [] 

    for integer in lst: 
     factors_i = uf(integer) 
     if factors_n.isdisjoint(factors_i): 
      no_common.append(integer) 

    return no_common 
+0

ありがとうございました!私はそれを見ることができませんでした。 –

2

が、私はそれが最大公約数を返すmath.gcdを使用して行うだろう:

factors_i = uf(lst[i]) 

をところで、あなたはあなたのコードを簡素化することができます2つの数の除数:

01正しい結果を出力
import math 

def no_shared_factors(num, items): 
    return [item for item in items if math.gcd(item, num) == 1] 

math.gcdはブラックボックスの多すぎる場合は、独自の実装を書いたり、mathコードをのぞくことができ

>>> no_shared_factors(15, [72, 27, 32, 61, 77, 11, 40]) 
[32, 61, 77, 11] 

を(Code for Greatest Common Divisor in Pythonを参照してください):

def gcd(a, b): 
    """ 
    Calculate the Greatest Common Divisor of a and b. 

    Unless b==0, the result will have the same sign as b (so that when 
    b is divided by it, the result comes out positive). 
    """ 
    while b: 
     a, b = b, a % b 
    return a 

WikipediaのGCDページをご覧ください。さらに多くの代替アルゴリズムがあります。

+0

ありがとうございました!これは、より洗練されたソリューションです。 –

関連する問題