私はPythonで次のリストを持っています:
l = [[2], [3], [2, 2], [5], [2], [3], [7], [2, 2, 2], [3, 3], [2], [5], [11], [2, 2], [3], [13], [2], [7], [3], [5], [2, 2, 2, 2], [17], [2], [3, 3], [19], [2, 2], [5]]
最大長の一意の値を持つサブリストを返す関数を書きたいと思います。この場合、関数は以下を返します。
l = [[5], [7], [3, 3], [11], [13], [2, 2, 2, 2], [17], [19]]
私はまだ Python の初心者であり、そのような関数を記述する方法についてはほとんどわかりません。私が得た最も遠いものは、ネストされたループを使用してサブリストを反復処理できることを理解することでした. しかし、私が Python について見てきたことから、探しているリストを返すには、ループを使用するよりも簡単な方法が必要なようです。
アップデート:
私がコードで行っていたことは次のとおりです。プロジェクト euler #5 を解決する、力ずくではない方法です!
このコードはリファクタリングできると確信していますが、何でも構いません。
助けてくれてありがとう、みんな。itemgetter
ちょうど私が必要としていたものでした。
#!/usr/bin/python
# coding = UTF-8
import argparse, sys, math
from itertools import groupby
from collections import defaultdict
from operator import itemgetter
parser = argparse.ArgumentParser()
parser.add_argument('filename', nargs='?')
args = parser.parse_args()
if args:
intinput = int(sys.argv[1])
elif not sys.stdin.isatty():
intinput = int(sys.stdin.read())
else:
parser.print_help()
def prime_factorize(n):
factors = []
number = math.fabs(n)
while number > 1:
factor = get_next_prime_factor(number)
factors.append(factor)
number /= factor
if n < -1:
factors[0] = -factors[0]
return factors
def get_next_prime_factor(n):
if n % 2 == 0:
return 2
for x in range(3, int(math.ceil(math.sqrt(n)) + 1), 2):
if n % x == 0:
return x
return int(n)
def mkfactors(n):
tpf = []
for i in range(n+1):
tpf.extend(prime_factorize(i))
return tpf
l = [list(g) for k,g in groupby(mkfactors(intinput))]
m = [max(g) for _,g in groupby(sorted(l,key=itemgetter(0)),key=itemgetter(0))]
prod = 1
for list in m:
for element in list:
prod *= element
print prod