Если у меня есть массив в Python, в котором все элементы имеют разные значения, например. [1,4,6,2,10,3,5]
,
есть ли способ найти общее количество значений в списке, которые больше, чем текущий индекс?
Так, например, используя приведенный выше список длины 7, результат, который я хотел бы получить, — это другой список длины 7, который выглядит как [6,3,1,5,0,4,2]
. У меня возникли проблемы с прокруткой списка (код, который я пытался использовать, приведен ниже)
for i in data:
count = np.sum(data > data[i])
N[i]=count
где data
— массив, содержащий все соответствующие значения, а N
— список np.zeros
той же длины, что и данные
Вот мое предложение:
Сортируем исходный список (l) и сохраняем его в новый список m. Мы создаем новый список (k), в котором мы сохраняем количество элементов, которые находятся справа от позиции каждого элемента в m. См. ниже:
l=[1,4,6,2,10,3,5]
m=sorted(l)
#[1, 2, 3, 4, 5, 6, 10]
k=[]
for i in l:
k.append(len(m)-m.index(i)-1)
>>> print(k)
[6, 3, 1, 5, 0, 4, 2]
Не используйте .index
в таком цикле, используйте enumerate
для перебора индекса и значения, или, черт возьми, даже просто вручную отслеживайте индекс самостоятельно.
Вы были очень близки. for i in data
перебирает каждый элемент, а не индексы, как в Java/C.
Вместо этого используйте range(len(data))
.
import numpy as np
data = np.array([1,4,6,2,10,3,5])
out = np.array([0]*7)
for i in range(len(data)):
count = np.sum(data > data[i])
out[i] = count
print(out) # [6 3 1 5 0 4 2]
Другой способ написать цикл — использовать enumerate()
, который возвращает итератор пар (индексов, элементов).
for i, x in enumerate(data):
count = np.sum(data > x)
out[i] = count
@juanpa.arrivillaga Ах да, хороший звонок. Изменено.
Что-то вроде этого?
list = [1,4,6,2,10,3,5]
list2 = []
v = len(list)
for x in list:
if x > v:
pass
else:
list2.append(x)
print(list2)
РЕДАКТИРОВАТЬ ¯\_(ツ)_/¯
(Чтобы увидеть общее количество элементов больше, чем текущий элемент)
list = [1,4,6,2,10,3,5]
list2 = []
v = len(list)
total = 0
for x in list:
if x > v:
pass
else:
list2.append(x)
for y in list2:
total += 1
list2 = str(list2).replace('[', '')
list2 = list2.replace(']', '')
print("Now - " + list2 + ", in total of " + str(total) + " numbers ;)")
Выход -
Now - 1, 4, 6, 2, 3, 5, in total of 6 numbers ;)
Я полагаю, что это находит все значения в списке меньше, чем длина списка? Я не уверен, что это именно то, что я искал (поскольку я хотел увидеть общее количество элементов больше, чем текущий элемент, а затем выполнить цикл), но все равно спасибо!
Ой, извините, я не уловил) я обновлю свой код
Кроме того, вы можете сделать это, используя vectorize
следующим образом:
>>> data = np.array( [1,4,6,2,10,3,5] )
>>> np.vectorize(lambda a, b : np.sum(a>b), excluded = [0] )(data, data)
array([6, 3, 1, 5, 0, 4, 2])
Вам нужно быть точным: вы работаете со списками или с массивами numpy?