Как сравнивать элементы в кортеже кортежей в Python

#python

#python

Вопрос:

Я новичок в python, и я наткнулся на это упражнение:

Учитывая следующий кортеж кортежей, вычислите общее количество яблок, бананов, дынь и ананасов, сравнивая первый элемент каждого кортежа:

 myTupleofTuples = (("apple",1),("banana",1),("apple",2),("melon",1),("pineapple",2),("banana",2))
for i,j in myTupleofTuples:
  counter = 0
  for k in range(len(myTupleofTuples)):
    if i in myTupleofTuples[k][0]:
      counter = counter   myTupleofTuples[k][1]
      print(i " is in "   myTupleofTuples[k][0]  " the counter of "  i  " is " ,counter )
  

Я привык работать с java или c и каким-то образом разработал предыдущее решение, хотя мне хотелось бы более похожего на python и элегантного решения проблемы.

Комментарии:

1. Итак, вы говорите, что этот код делает именно то, что вы хотите, но вам нужно более питоновское решение?

2. Более по-питоновски говорить for item in sequence , а затем ссылаться на item напрямую, вместо for i in range(len(sequence)) .

3. Второстепенный момент: в Python вы должны называть переменные скорее как my_tuple_of_tuples вместо myTupleofTuples.

Ответ №1:

Один из моих любимых шаблонов для подсчета — использование defaultdict . Вот так:

 from collections import defaultdict

myTupleofTuples = (("apple",1),("banana",1),("apple",2),("melon",1),("pineapple",2),("banana",2))
sums = defaultdict(int)
for fruit, count in myTupleofTuples:
    sums[fruit]  = count
print(list(sums.items()))
  

Комментарии:

1. Очень хорошее решение. Этот же вариант использования даже указан в примерах для defaultdict документов на Python

Ответ №2:

Немного более питоническая версия (с использованием f-строк и распаковки переменных), эквивалентная вашей:

 for fruit1, number1 in myTupleofTuples:
    counter = 0
    for fruit2, number2 in myTupleofTuples:
        if fruit1 in fruit2:
          counter  = number2
          print(f"{fruit1} is in {fruit2} the counter of {fruit1} is {counter}")
  

Вместо этого я бы посчитал фрукты (с тем же именем, поэтому, используя == вместо in при сравнении имен), используя счетчик:

 from collections import Counter
counter = Counter()
for name, value in myTupleofTuples:
    counter[name]  = value
  

Ответ №3:

Словарь очень удобен, когда вы решаете эту проблему. В качестве примера приведем приведенный ниже код.

 count_dict = {} # creating an empty dictionary
for fruit,num in myTupleofTuples: # loops each tuple and separate each individual tuple into fruit and num variable
  count = count_dict.get(fruit, 0) # get value if fruit exist in dictionary else give 0
  count_dict[fruit] = num   count # add the count with number
  

Если вы хотите распечатать их так, как у вас есть:

 for key,value in count_dict.items():
  print('{} is in {} and There are {} {}n'.format(key, [x for x in range(len(myTupleofTuples)) if myTupleofTuples[x][0]==key] value, key)) 
  # just adding list comprehension for finding index, you can use function as well
  

Вывод:

 apple is in [0, 2] and There are 3 apple
banana is in [1, 5] and There are 3 banana
melon is in [3] and There are 1 melon
pineapple is in [4] and There are 2 pineapple