如何从提供的向量中找到最大的数字?

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 获得44444644 大很多。 是的,你是对的。也想简要介绍一下组合。我错过了。感谢您纠正我。

以上是关于如何从提供的向量中找到最大的数字?的主要内容,如果未能解决你的问题,请参考以下文章

我将如何编写算法来找到序列中从数字到数字的最大跳跃?

获取R向量中的所有最大值索引

如何找到向量中的最大元素(C++)?

最大似然和支持向量复杂度

向量。如何设置最大元素数并找到当前计数?

如何根据 R 中的用户定义层次结构找到向量的最大字符?