Ты довольно близок; вы ищете сопоставленные типы , которые позволяют выполнять итерацию по клавишам (в отличие от использования индексатора). То есть, не используйте это:
{[key: K]: IResources[K]}
используйте это вместо:
{[P in K]: IResources[P]}
На самом деле, это достаточно полезная конструкция, которая существует в стандартная библиотека as Pick
:
Pick
Таким образом, ваша функция станет чем-то вроде:
export function mapResources(resources: IResources, keys: K[]): Pick {
return keys.reduce((response, key) => ({
...response,
[key as string]: resources[key]
}), {});
}
Это не сможет ввести проверку в реализацию, потому что я не знаю Не думайте, что TypeScript понимает тип распространения на Pick
. Если вы уверены, что все в реализации в порядке, вы можете использовать утверждения any
, чтобы помочь:
export function mapResources(resources: IResources, keys: K[]): Pick {
return keys.reduce((response, key) => ({
...(response as any),
[key]: resources[key]
}), {});
}
Вы можете проверить, что это ведет себя по желанию (я не могу легко это сделать без зная, что IResources
). Надеюсь, это поможет; удачи!
numbers = {'a': 1, 'b': 0, 'c': 1, 'd': 3, 'e': 3}
[k for k,v in numbers.iteritems() if v == max(numbers.values())]
печатает
['e', 'd']
, что он делает, перебирает все записи через .iteritems
, а затем проверяет, является ли это значение максимальным, и если так, добавьте ключ в список.
numbers = {'a': 1, 'b': 4, 'c': 1, 'd':4 , 'e': 3}
mx_tuple = max(numbers.items(),key = lambda x:x[1]) #max function will return a (key,value) tuple of the maximum value from the dictionary
max_list =[i[0] for i in numbers.items() if i[1]==mx_tuple[1]] #my_tuple[1] indicates maximum dictionary items value
print(max_list)
Этот код будет работать в O (n). O (n) в поиске максимального значения и O (n) в понимании списка. Таким образом, в целом он останется O (n).
Примечание: O (2n) эквивалентно O (n).