Why would you use a list comprehension? A list comprehension only knows about any one member of a list at a time, so that would be an odd approach. Instead:
def findMiddle(input_list):
middle = float(len(input_list))/2
if middle % 2 != 0:
return input_list[int(middle - .5)]
else:
return (input_list[int(middle)], input_list[int(middle-1)])
This one should return the middle item in the list if it’s an odd number list, or a tuple containing the middle two items if it’s an even numbered list.
Edit:
Thinking some more about how one could do this with a list comprehension, just for fun. Came up with this:
[lis[i] for i in
range((len(lis)/2) - (1 if float(len(lis)) % 2 == 0 else 0), len(lis)/2+1)]
read as:
“Return an array containing the i
th digit(s) of array lis
, where i is/are the members of a range, which starts at the length of lis, divided by 2, from which we then subtract either 1 if the length of the list is even, or 0 if it is odd
, and which ends at the length of lis, divided by 2, to which we add 1
.”
The start/end of range correspond to the index(es) we want to extract from lis
, keeping in mind which arguments are inclusive/exclusive from the range()
function in python.
If you know it’s going to be an odd length list every time, you can tack on a [0]
to the end there to get the actual single value (instead of an array containing a single value), but if it can or will be an even length list, and you want to return an array containing the two middle values OR an array of the single value, leave as is. 🙂
Я хочу иметь возможность печатать средний элемент списка. Список может быть просто строками, целыми числами или смешанными. Я попробовал это, найдя индекс среднего элемента, но не работает. (Печатает 2)
list = [1,3,7,"this",3,"that",7]
if int(len(list))<2:
middle = 1 // if it has less than 2 entries, the first entry is the middle one.
elif int(len(list)) %2 == 0 :
middle = int(len(list)/2)
else:
middle = int((len(list)/2) - 1)
print(list[middle])
2 ответа
Лучший ответ
Если вы хотите округлить вниз для нечетного количества элементов списка, вы можете использовать math.trunc
для всех случаев:
l = [1,3,7,"this",3,"that",7]
middle = math.trunc(len(l)/2)
print(middle)
>>> 3
2
Maurice Meyer
28 Дек 2019 в 12:58
Вы не можете использовать list в качестве имени переменной, оно уже зарезервировано. Во-вторых, комментарии в python должны быть такими # comment , а не // comment .
Следующий код работает просто отлично:
listt = [1,3,7,"this",3,"that", 7]
middle = int((len(listt)/2))
print(listt[middle])
1
Shinobi San
28 Дек 2019 в 12:53
Почему вы используете понимание списка? Понимание списка знает только об одном члене списка за раз, так что это будет странный подход. Вместо:
def findMiddle(input_list):
middle = float(len(input_list))/2
if middle % 2 != 0:
return input_list[int(middle - .5)]
else:
return (input_list[int(middle)], input_list[int(middle-1)])
Это должно возвращать средний элемент в списке, если он представляет собой список нечетных номеров, или кортеж, содержащий два элемента, если он является четным списком.
Редактировать:
Еще раз подумав о том, как можно сделать это с пониманием списка, просто для удовольствия. Пришел к следующему:
[lis[i] for i in
range((len(lis)/2) - (1 if float(len(lis)) % 2 == 0 else 0), len(lis)/2+1)]
читать как:
“Возвращает массив, содержащий i
й разряд массива lis
, где я – члены диапазона, начинающийся the length of lis, divided by 2, from which we then subtract either 1 if the length of the list is even, or 0 if it is odd
и заканчивается the length of lis, divided by 2, to which we add 1
“
Начало/конец диапазона соответствуют индексу (es), который мы хотим извлечь из lis
, имея в виду, какие аргументы включены/исключены из функции range()
в python.
Если вы знаете, что каждый раз он будет списком нечетной длины, вы можете сделать ставку на [0]
до конца, чтобы получить фактическое одиночное значение (вместо массива, содержащего одно значение), но если оно может или будет список длины, и вы хотите вернуть массив, содержащий два средних значения или массив из одного значения, оставить как есть. 🙂
Вы сильно усложняете решение задачи
# среднее арифметическое:
my_list = [float(x)for x in input().split()]
mean = sum(my_list)/len(my_list)
Допустим, ввели список:
my_list = [1.0, -1.5, 2.4, -1, -3]
тогда:
mean = sum(my_list)/len(my_list) # -0.42000000000000004
Далее, индекс ближайшего числа к среднему арифметическому:
closest = sorted(list(enumerate(my_list)), key=lambda x: abs(x[1]-mean))[0][0]
в нашем случае closest будет 3
. Действительно, число с индексом 3 ближе всего к среднему арифметическому
Теперь вычисляем сумму между первыми положительными числами списка (в данном случае, включая сами эти числа):
Для начала отбираем все положительные числа из списка и получаем их индексы:
positive = [x for x in enumerate(my_list) if x[1]>0][:2]
# positive будет [(0, 1.0), (2, 2.4)]
Затем берем индексы этих чисел и вычисляем сумму значений в срезе исходного списка:
positive_sum = sum(my_list[positive[0][0]:positive[1][0]+1])
получаем 1.9
Действительно, первые два положительных числа нашего списка – 1.0 и 2.4. Сумма между ними, включая сами числа : 1.0 + (-1.5) + 2.4 = 1.9
Если нужно найти сумму элементов между первыми положительными значениями, не включая эти самые значения, то тогда делаем так:
positive_sum = sum(my_list[positive[0][0]+1:positive[1][0]])
Получаем -1.5
Итого, все ваши вычисления сводятся к 5 строкам кода.
m0nte-cr1st0 , спасибо. А к чему это
странно, для малых чцифр работает правильно, а для больших – не всегда:
[4, 4, 1, 8, 7] 4.8
4
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[6, 4, 2, 7, 4] 4.6
4
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[2, 1, 9, 9, 9] 6.0
9
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[8, 3, 9, 6, 8] 6.8
6
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[5, 1, 2, 8, 4] 4.0
4
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[8, 9, 8, 5, 7] 7.4
7
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[5, 4, 9, 7, 8] 6.6
7
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[5, 9, 3, 4, 1, 3] 4.166666666666667
4
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[4, 2, 1, 3, 6] 3.2
3
0