2016-09-03 34 views
0

我已經編寫了代碼,它返回給定數字的唯一素數因子。以下是該代碼。此代碼不認爲1是唯一的素數。 factorial3是返回任意給定數字的階乘列表的函數。列表解析根據條件向元素添加值

def factorials(n): 
    x=[j for j in range(1, ((n/2)+1)) if n%j==0] 
    x.append(n) 
    return x 

n=input() 
numbers=[] 
for i in range(n): 
    numbers.append(input()) 

count=[0 for j in numbers] 
for i,k in enumerate(numbers): 
    for j in factorial3(k): 
      if factorial3(j)==[1,j]: 
        count[i]+=1 

列表count給我輸入的唯一的素數數字。

例如,對於2號10,20,因子是[2,5,10]和[2,5,10,20]。但是,唯一的主要因素分別是[2,5]和[2,5]。因此,計數是[2,2]

我想達到與列表解析相同但迄今爲止失敗。這是我到目前爲止嘗試過的東西。

c=[0 for i in numbers] 

new=[i+1 for i,k in enumerate(numbers) for j in factorial3(k) if factorial3(j)==[1,j]] 
print new 
new1=[c[i]+1 for i,k in enumerate(numbers) for j in factorial3(k) if factorial3(j)==[1,j]] 
print new1 

我幾乎在那裏,只是想念一件事情只是減少迭代一次。

+1

不要使用列表解析的副作用;這是非常浪費的,因爲你實際上並沒有使用你建立的列表。 –

+0

@MartijnPieters,我只是想知道如何做知識目的的列表理解。我不會在實際情況下使用它們。 –

回答

0

我能達到什麼樣的,我想用下面的代碼。

new1=[i+1 for i,k in enumerate(numbers) for j in factorial3(k) if factorial3(j)==[1,j]] 

c1={} 
for i in new1: 
    if i not in c1: 
      c1[i]=1 
    else: 
      c1[i]+=1 

sortedc=[v for k,v in sorted(c1.items(), key=lambda x:x[0])] 
x=zip(numbers, sortedc) 

此代碼不返回1的正確值,並且與所有其他正整數一起工作得很好。我在代碼結束時手動添加了1的階乘。

0

如果你想要素數因子,那麼只需要上升到平方根,而不是整個範圍。

替換您的第一行:

c=[0 for i in numbers] 

有:

c=[0 for i in numbers**0.5] 
+0

仍然你的代碼是不正確的。 –

+0

你能發佈你的factorial3()函數嗎?這將有助於在其他SO用戶的機器上再現這一點。 – FrenchDwarf

+0

我已添加factorial3函數。謝謝 ! –