Интерпретация диапазона (n) и логического списка, однозначная карта, проще? - PullRequest
0 голосов
/ 06 января 2011
#!/usr/bin/python
#
# Description: bitwise factorization and then trying to find
# an elegant way to print numbers

# Source: http://forums.xkcd.com/viewtopic.php?f=11&t=61300#p2195422
# bug with large numbers such as 99, but main point in simplifying it
#
def primes(n):
    # all even numbers greater than 2 are not prime.
    s = [False]*2 + [True]*2 + [False,True]*((n-4)//2) + [False]*(n%2)
    i = 3;
    while i*i < n:
        # get rid of ** and skip even numbers.
        s[i*i : n : i*2] = [False]*(1+(n-i*i)//(i*2))
        i += 2
        # skip non-primes
        while not s[i]: i += 2
    return s


# TRIAL: can you find a simpler way to print them?
# feeling the overuse of assignments but cannot see a way to get it simpler
#
p = 49
boolPrimes = primes(p)
numbs = range(len(boolPrimes))
mydict = dict(zip(numbs, boolPrimes))

print([numb for numb in numbs if mydict[numb]])

Что-то, что я ищу, можете ли вы сделать TRIAL чрезвычайно простой из приведенных ниже?Любой такой метод?

a=[True, False, True]
b=[1,2,3]
b_a                    # any such simple way to get it evaluated to [1,3]
                       # above a crude way to do it in TRIAL

Ответы [ 3 ]

2 голосов
/ 06 января 2011

Для python2.7 + вы можете использовать itertools.compress

itertools.compress(b,a)

например

>>> from itertools import compress
>>> a=[True, False, True]
>>> b=[1,2,3]
>>> list(compress(b,a))
[1, 3]

в противном случае вы можете использовать понимание списка

>>> [j for i,j in zip(a,b) if i]
[1, 3]

Если вы хотите сделать это в своем списке простых чисел, может быть проще использовать перечисление

>>> primes = [False, False, True, True, False, True]
>>> list(compress(*zip(*enumerate(primes))))
[2, 3, 5]
0 голосов
/ 06 января 2011

Делать диктат здесь - это совсем не то, что вам нужно, потому что диктовки неупорядочены.Хранение пар в виде пар на самом деле упрощает логику, потому что вы можете перебирать пары, давать имена двум элементам и использовать эти имена в понимании.

Pythonic способ «сжать» список с параллельным спискомиз индексов использовать enumerate.

Таким образом:

print ([x for (x, y) in enumerate(primes(49)) if y])
0 голосов
/ 06 января 2011

Вы можете использовать enumerate вместе со списком, чтобы значительно упростить это до:

p = 49
print([num for num, isprime in enumerate(primes(p)) if isprime])
...