#python #dictionary
#python #словарь
Вопрос:
Сначала я чувствую необходимость объяснить мотивацию этого вопроса. В последнее время я играл в игру на своем мобильном телефоне, основная цель которой — набрать 270 голосов на выборах и стать президентом. Для того, чтобы заручиться поддержкой определенной категории, вы должны получить большинство из назначенного веса этих штатов в долларах.
Итак, я был обеспокоен минимальной суммой денег, необходимой для определения категории, в которую попадают эти состояния. Это сделало словари отличным выбором для решения проблемы. Ниже приведен словарь с инициалами состояния в качестве ключей и их весом в долларах.
states_dict = { 'CA': 200, 'TX':200, 'NY': 150, 'FL': 100, 'IL': 50, 'AR':24, 'CO': 18, 'NM': 15, 'NV': 17.5 , 'NJ': 42.5}
Вначале нужно найти сумму словарных статей и разделить ее на 2. Если частичная сумма меньше, чем полусумма, мы должны продолжать добавлять, и как только она превысит полусумму, мы должны остановиться и сравнить ее с предыдущим минимумом. Если она меньше, мы должны заменить текущий минимум на вновь найденный минимум.
Я новичок в словарях, и я знаю только, как их просматривать, но все же здесь я должен вычислить каждую частичную сумму в списке. Есть ли способ вычислить НАИМЕНЬШУЮ ВОЗМОЖНУЮ СУММУ в этом списке?
Комментарии:
1. Что такое «частичная сумма» и «половинная сумма»?
2. @DevanshSoni «частичная сумма» относится ко всем возможным суммам в словаре, например, к значениям TX CA, CO NM , CO NM TX AR и т.д. В двух словах, каждая возможная сумма, включающая значения ключей, присутствующих в dict
3. @DevanshSoni полусумма — это просто сумма, деленная на 2 . Если сумма собранных вами состояний больше половины суммы, вы получаете поддержку этой группы
4. можете ли вы расширить ожидаемый результат с помощью примера
5. @deadshot уверен. Предположим, у нас есть следующий dict { ‘CA’: 200,’TX’: 200, ‘NY’: 150, ‘FL’: 100,’IL’:50}. Сумма равна 700 , следовательно, половина суммы равна 350. Программа (или функция) должна напечатать (или вернуть) строку с состояниями, добавленные веса которых равны 350. В этом случае ‘CA NY’, существует более 1 комбинации, но в данном случае это не имеет значения.
Ответ №1:
Хорошо, сначала я подумал, что могу просто отсортировать значения в порядке возрастания, а затем добавить их, пока не получу значение, превышающее требуемый минимум, однако я понял, что вы можете даже использовать наибольшее значение и добавить его к наименьшему значению и получить значение, которое ниже, чем то, которое вы получаете при добавлении отсортированных значений, верно?
итак, для меня это означало, что для работы этого кода, если у вас есть 10 значений, вам нужно получить разные комбинации, то есть все способы выбора этих значений, чтобы вы могли получить разные суммы из 9 разных чисел, 8 чисел, 7 чисел …… до 2 чисел или 1 числа в любом случае
итак, этот код работает, получая различные комбинации, подобные этой, для 9 чисел до 1 числа … 10 чисел было бесполезно, потому что, если у вас есть только 10 чисел, независимо от того, как вы их выбираете, у вас все равно будет одинаковая сумма для чисел
в коде я добавил комментарии, чтобы точно показать, где находятся эти шаги и как я их выполнил
import itertools
# itertools is used to generate all possible combinations for the values, its there automatically
# you don't need to download it
states_dict = { 'CA': 200, 'TX':200, 'NY': 150, 'FL': 100, 'IL': 50, 'AR':24, 'CO': 18, 'NM': 15, 'NV': 17.5 , 'NJ': 42.5}
#calculating the minimum by dividing total by 2
#getting the sum of all the values in the dictionary
total = sum(states_dict.values())
#dividing the sum by 2 to get the minimum
minimum = total/2
#displaying the minimum
print("The minimum value is: {}".format(minimum))
#Output: The minimum value is: 408.5
# storing the values only in a list, so that its easier to work with them
values = list(states_dict.values())
#empty list that will store all the combinations from 9 numbers to 1 number
all_combinations = []
#empty list that will store all the sums of the different combination, the sum of each combination is stored as a different element
all_sums = []
#generates a list of all possible combinations
#r is number of numbers that is involved in the combination
#when r is 5 it will get all the ways that five different numbers from the list of 10 numbers can be selected
# the length here is 10, so the combinations will only reach 9 numbers
for r in range(len(values)):
#here is where i used itertools to generate the combinations for me (nCr)
combinations_object = itertools.combinations(values, r) #takes iterable(values) and r(number of numbers)
#convert the itertools object to a list, so that we can add it to the bigger list, also so that we can get the sum of the elements easily kater
combinations_list = list(combinations_object)
# adding the new combination to the bigger list, which makes a 2d array
all_combinations = combinations_list
#generates a list of the sums of the values in the combinations
for objects in all_combinations:
#the sum function here adds the values in each combination
sum_object = sum(list(objects))
#adding the sum into an array which holds the sums of the different combinations
all_sums.append(sum_object)
#sorts the list of sums in ascending order (smallest sum to largest sum)
all_sums = sorted(all_sums)
#gets lowest sum that is above the minimum
#now that the list of sums is sorted, we just iterate through it so that immediately it gets a sum that is above the minimum value(408.5) it captures it and stores it in a variable (required value)
for sum_object in all_sums:
if (sum_object>minimum):
# store required value once the loop reaches it
required_value = sum_object
#display the required value (409.5)
print("The required value is: {}".format(sum_object),end="n")
#break out of the loop because we've got what we wanted and don't need to continue looping
break
#prints out the combinations whose sum is the required value
#re-using the list of combinations now that we have the value, we just check whether the sum of the values inside the combination is the same as the required value, and if it is we print it out
print("nThe combinations are: ")
for objects in all_combinations:
#if the sum of number in combination is same as required value
if (sum(list(objects)) == required_value):
#display the items in that combination
print(objects,end="n")
#Output
# The minimum value is: 408.5
# The required value is: 409.5
# The combinations are:
# (17.5, 18, 24, 150, 200)
# (17.5, 18, 24, 150, 200)
# (17.5, 18, 24, 50, 100, 200)
# (17.5, 18, 24, 50, 100, 200)
Я не стал затем отображать состояния, которые будут иметь эти значения, потому что я думал, что это сделает код действительно длинным и утомительным для чтения, учитывая, что человек, который спрашивал, запрашивал только значение
итак, я надеюсь, что это то, что вы искали, и это поможет вам
Комментарии:
1. Ответ только для кода может помочь OP немедленно, но StackOverflow предназначен не только для OP. SO — это не веб-сайт для людей, использующих краудсорсинг своего кода, и ответ только для кода поощряет такое поведение. Хороший ответ включает объяснение того, как / почему этот код устраняет проблему. О, и, пожалуйста, давайте сохраним запрос на повышение голосов на Youtube.
2. кто … извини, братан
3. хорошо, давайте отредактируем код, чтобы объяснить, как это работает … я просто новичок в stack, поэтому я не стал много объяснять, я не знаю, как хорошо использовать функции