2012-07-16 2 views
1

Je suis débutant chez python (une semaine). Ici, je suis en train imprimer la liste de tous le principal facteur de 60. Mais pour la ligne 19, je reçois l'erreur suivante: TypeError: type d'opérande non pris en charge (s) pour%: « liste » « float » etComment appliquer des opérations mathématiques à chaque numéro d'une liste en python?

Le code:

whylist = [] 
factor = [] 
boom = [] 
primefactor = [] 
n = 60 
j = (list(range(1, n, 1))) 



for numbers in j: 
    if n%numbers == 0: 
     whylist.append(numbers) 
     for everynumber in whylist: 
      factor.append(everynumber) 

for things in factor: 
    u = (list(range(1, things, 1))) 
    d = float(things) 
    if d%u == 0: 
     boom.append(things) 
    if len(boom) == 1: 
     for every in boom: 
      primefactor.append(every) 
print(primefactor) 

Qu'est-ce que je fais mal?

+0

@Levon 'range' ne renvoie pas de liste sur python3.x, mais vous avez raison, je ne pense pas que' list (range (...)) 'soit nécessaire ici. – mgilson

+0

@mgilson Ah .. oui, bon point .. n'a pas remarqué la balise .. merci! – Levon

Répondre

10

Pour appliquer une opération mathématique à chaque élément dans une liste que vous pouvez utiliser une liste-compréhension:

new_list = [ x%num for x in old_list] 

Il existe d'autres façons de le faire aussi bien. Parfois, les gens utiliseront map

new_list = map(lambda x: x%num, old_list) 

, mais la plupart des gens préfèrent la première forme qui est généralement plus efficace et plus clair que l'utilisation lambda (qui peut être un peu déroutant quand vous commencez à vous familiariser python).

EDIT

est ici une implémentation récursive de ce que vous essayiez:

def factorize(n): 
    out=[] 
    for i in range(2,n): 
     if(n%i == 0): #first thing to hit this is always prime 
      out.append(i) #add it to the list 
      out+=factorize(n/i) #get the list of primes from the other factor and append to this list. 
      return out 
     else: 
      return [n] # n%i was never 0, must be prime. 

print factorize(2000) 
+0

On dirait que ma planification était erronée, la fixation de u comme la liste me donne maintenant ouput [2,2] (Je cherche le facteur premier) puis-je avoir une idée de ce que je pourrais supposer faux? – Mubtasim

+0

@MubtasimSh - J'ai un peu de mal à comprendre votre code et ce que vous essayez de faire avec. J'ai ajouté une fonction factorielle récursive qui semble fonctionner. – mgilson

1

Une autre option consiste à utiliser des tableaux numpy au lieu de listes.

import numpy as np 
j = np.arange(1,n,1) 
rem = np.mod(j,num) 

et numpy prendra soin des opérations de diffusion pour vous. Il devrait également être plus rapide que les listes de compréhension ou de carte.

+0

Les ops vectoriels sont pratiques, mais un danger facile à ignorer lors de l'utilisation de numpy pour les problèmes d'Euler est que si vous n'utilisez pas 'dtype = object' ou quelque chose, les entiers ne seront pas arbitraires-précision. – DSM

+0

@tcaswell - Numpy est génial. J'ai joué avec l'idée de l'ajouter à ma réponse, mais j'ai décidé que ma réponse serait plus «pure» sans elle. Je suis content que tu l'aies ajouté. Ici, vous pouvez simplement utiliser l'opérateur '%' et cela fonctionnera toujours. 'rem = j% num' – mgilson

+0

@DSM Vrai, mais cela ne devrait devenir un problème que lorsque vous traitez de grands nombres, auquel cas le brutal forçant le problème n'est probablement pas la bonne solution. – tacaswell

Questions connexes