如何从提供的向量中找到最大的数字?
Posted
技术标签:
【中文标题】如何从提供的向量中找到最大的数字?【英文标题】:How to find highest number from the vector provided? 【发布时间】:2020-06-13 21:36:38 【问题描述】:说,字典提供了某些值。 如何找到最大的数字?
输入
d1 = 1: 1, 2: 6, 3: 7, 4: 1, 5: 3
vector = 5
d1 = 1: 1, 2: 6, 3: 7, 4: 1, 5: 3
vector = 5
l1 = list(td.values())
基于向量值,它应该打印输出。
向量是 5,所以形成向量的字典值的总和是3,1,1
对应键为5,4,1
所以,output should be 541
但这里略有变化。
由于value '1'
与multiple keys
相关联,它应该接highest key
,
所以,output should be 544 instead of 541
(对于上述输入,简要介绍组合,不考虑 '1+1+1+1+1' 到 '44444')
另一个例子
d1 = 1: 1, 2: 6, 3: 7, 4: 1, 5: 3
vector = 7
Possible combinations:
3 # --> Key of 7
21 # --> Key of 6 & 1 (6+1 = 7)
24 # --> Key of 6 & 1 (6+1 = 7)
12 # --> Key of 1 & 6 (1+6 = 7)
42 # --> Key of 1 & 6 (1+6 = 7)
Output : 42 (Highest number)
另一个
d1 = 1:9,2:4,3:2,4:2,5:6,6:3,7:2,8:2,9:1
vector = 5
here, it would be 1+2+2 (988).
But, '1' can also be added 5 times to form vector 5,
which would be '99999'
由于@Patrick Artner
要求提供最小可重现示例,但发布此内容并没有按预期工作。
from itertools import combinations
def find_sum_with_index(l1, vector):
index_vals = [iv for iv in enumerate(l1) if iv[1] < target]
for r in range(1, len(index_vals) + 1):
for perm in combinations(index_vals, r):
if sum([p[1] for p in perm]) == target:
yield perm
d1 = 1: 1, 2: 6, 3: 7, 4: 1, 5: 3
vector=5
l1=list(d1.values())
for match in find_sum_with_index(l1, vector):
print(dict(match))
Is there any specific algorithm to be chosen for these kind of stuffs ?
【问题讨论】:
你有什么问题。您是否有查看值并计算所有可能的部分总和以达到vector
的算法? minimal reproducible example?
@Patrick Artner:向量不过是总和。并且从 dict-values 中,应该找到形成向量和的组合。然后,应该找到这些组合的键(最高值)。
@PatrickArtner :我理解您对最小可重现示例的担忧。
从itertools/combinations(列表)中,可以得到可能的组合形成向量。 d1 = 1: 1, 2: 6, 3: 7, 4: 1, 5: 3 , vector=5, , l1 = list(d1.values()) 即 l1 = [1,6,7, 1,3]。你会得到 0:1,3:1,4:3 的结果(来自列表,index:element)。如果你追溯它以获得最高数字形成向量将是 430 这是不正确的。应该是 544 wrt 字典。
@PatrickArtner : 发布在上面,希望现在清楚了。
【参考方案1】:
与另一个答案类似,但允许重复使用相同的键来获得值总和向量的最大键数:
d1 = 1: 1, 2: 6, 3: 7, 4: 1, 5: 3
vector = 7
#create a dict that contains value -> max-key for that value
d2 =
for k,v in d1.items():
d2[v] = max(d2.get(v,-1), k)
def mod_powerset(iterable,l):
# uses combinations_with_replacement to allow multiple usages of one value
from itertools import chain, combinations_with_replacement
s = list(set(iterable))
return chain.from_iterable(combinations_with_replacement(s, r) for r in range(l))
# create all combinations that sum to vector
p = [ s for s in mod_powerset(d1.values(),vector//min(d1.values())+1) if sum(s) == vector]
print(p)
# sort combinations by length then value descending and take the max one
mp = max( (sorted(y, reverse=True) for y in p), key=lambda x: (len(x),x))
# get the correct keys to be used from d2 dict
rv = [d2[num] for num in mp]
# sort by values, biggest first
rv.sort(reverse=True)
# solution
print(''.join(map(str,rv)))
原始 powerset - 请参阅 itertools-recipes。
【讨论】:
【参考方案2】:其中涉及一些步骤,请参阅代码中 cmets 中的文档:
d1 = 1: 1, 2: 6, 3: 7, 4: 1, 5: 3
vector = 7
# create a dict that contains value -> sorted key-list, used to get final keys
from collections import defaultdict
d2 = defaultdict(list)
for k,v in d1.items():
d2[v].append(k)
for k,v in d2.items():
d2[k] = sorted(v, reverse=True)
from itertools import chain, combinations
def powerset(iterable):
"see itertools: powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
# create all combinations that sum to vector
p = [ s for s in powerset(d1.values()) if sum(s) == vector]
# sort combinations by length then value descending and take the max one
mp = max( (sorted(y, reverse=True) for y in p), key=lambda x: (len(x),x))
# get the correct keys to be used from d2 dict
rv = []
for num in mp:
rv.append(d2[num][0])
# remove used key from list
d2[num][:] = d2[num][1:]
# sort by values, biggest first
rv.sort(reverse=True)
# solution
print(''.join(map(str,rv)))
有关 powerset - 请参阅 itertools-recipes。
【讨论】:
谢谢帕特里克。但它为向量 5 打印 541。应该打印 544 而不是我上面解释的。 @Stackguru - 如果您可以多次使用密钥,请不要使用d2[num][:] = d2[num][1:]
从 d2 中删除曾经使用过的密钥 - 您可以通过仅记住最大值来稍微简化 d2 的创建每个值的键,而不是存储每个值的键列表
但在这种情况下有一些例外,d1 = 1:9,2:4,3:2,4:2,5:6,6:3,7:2,8:2 ,9:1 vector = 5 ,这里是 1+2+2 (988)。但是,“1”也可以加 5 次,形成向量 5,即最大数字为“99999”。
@StackG 然后你的问题如果指定不当 - 而不是使用3,1,1
来获得5
你也可以从1,1,1,1,1
完成1,1,1,1,1
全部从4
-Key 获得44444
比644
大很多。
是的,你是对的。也想简要介绍一下组合。我错过了。感谢您纠正我。以上是关于如何从提供的向量中找到最大的数字?的主要内容,如果未能解决你的问题,请参考以下文章