如何对字典中的项目进行排序并显示最大的键和值



我写了一个程序,从输入中读取10个数字,并在最后打印出第一个数字的除数最多的数字以及输出中第一个数的除数。如果有几个具有此模式,请打印其中最大的一个。

我给程序的输入:

1854
9875
3567
2568
2984
5428
6487
7982
3485
2157
import operator
number_list= []
divisor_prime_list = []
dwq = {}
sd = []
for i in range(10):
n = int(input())
number_list.append(n)
i = 2
a = {}
factors = []
while i*i<=n :
if n % i:
i += 1
else:
n //= i
factors.append(i)

if n > 1:
factors.append(n)
fu = list(set(factors))
divisor_prime_list.append(len(fu))
for d in number_list:
for iq in divisor_prime_list:
dwq[d] = iq
divisor_prime_list.remove(iq)
break
b = reversed(sorted(dwq.items(),key=operator.itemgetter(0)))
for k,v in b:
print(k,v)
break

但我在显示输出时遇到了问题

我的代码输出不正确:

9875 2

以及正确的输出:

7982 3

请帮我编辑代码,以便它向我显示正确的输出

以下是您修复的代码:

number_list = []
divisor_prime_list = []
dwq = []
sd = []
for j in range(10):
n = int(input())
number_list.append(n)
i = 2
a = {}
factors = []
while i * i <= n:
if n % i:
i += 1
else:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
fu = set(factors)
divisor_prime_list.append(len(fu))
for d, p in zip(number_list, divisor_prime_list):
dwq.append((p, d))
b = max(dwq)
print(b[1], b[0])

外部for的循环变量i与用于查找素数的循环变量相同。

你忘了在fu = list(set(factors))上付款

for d in number_list之后,我一直无法理解你的意图,所以我重写了很多。你所需要做的就是收集成对的数字及其除数。如果你把除数放在第一位,你所需要做的就是找到对的最大值。请记住,元组按第一个元素排序(默认情况下(,然后按第二个元素排序,依此类推

我建议以函数的形式为您的问题编写一些可测试的构建块

例如:

from math import gcd
from itertools import combinations
def prime_factors(n):
i = 2
factors = []
while i * i <= n:
if n % i:
i += 1
else:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
return factors
def factor_count(x):
primes = prime_factors(x)
return len([t for n in range(1, len(primes) + 1)
for t in set(combinations(primes, n))])

应用:

a = 1854
b = [9875, 3567, 2568, 2984, 5428, 6487, 7982, 3485, 2157]
ndiv = [factor_count(gcd(a, x)) for x in b]
max([(n, x) for n, x in zip(ndiv, b)])
# out:
(3, 2568)

如果您必须接受用户输入等,则:

values = [int(input()) for _ in range(10)]
a, b = values[0], values[1:]
# and then use the above

补充:

# while not immediately needed in your question, you may like:
from functools import reduce
def prod(a):
return reduce(lambda x, y: x * y, a)
def factors(x):
primes = prime_factors(x)
for n in range(1, len(primes) + 1):
for t in set(combinations(primes, n)):
yield prod(t)

示例:

>>> prime_factors(20)
[2, 2, 5]
>>> sorted(factors(20))
[2, 4, 5, 10, 20]
>>> factor_count(20)
5
# list of each pair under consideration, along with common divisors:
>>> [(a, x, sorted(factors(gcd(a, x)))) for x in b]
[(1854, 9875, []),
(1854, 3567, [3]),
(1854, 2568, [2, 3, 6]),
(1854, 2984, [2]),
(1854, 5428, [2]),
(1854, 6487, []),
(1854, 7982, [2]),
(1854, 3485, []),
(1854, 2157, [3])]

最新更新