Как перебрать полный список в Python?Для цикла останавливается на 1-м экземпляре - PullRequest
0 голосов
/ 22 сентября 2019

Я пытался заставить цикл for перебирать полные значения списка с именем pdg_vals.Я хочу получить номер индекса всех значений, равных 14. Затем я хочу создать новый список, используя эти значения индекса.

Python продолжает возвращать первый экземпляр условия.То есть, это показывает, что новый список, который я добавляю (pdg_ent), заполнен только значением индекса первого экземпляра, где pdg_vals имеет значение 14.

Я попытался добавить, используя операцию + =.

вот код:

myfile = ROOT.TFile("/home/hilary/root/compile/Research/GENIE_atm.root")
mydir = myfile.GENIE
mytree = mydir.Get("Event")
pdg_vals = [] #an empyt list to fill pdg values
for e in mytree:
    for v in e.mc_pdg:
        pdg_vals += [v] #fill empty list with mc_pdg values
#pdg_vals
pdg_ent = []

for x in pdg_vals:
    if x == 14:
        pdg_ent += [pdg_vals.index(x)]

pdg_ent

вот как выглядит список pdg_vals:

[12,
 1000180400,
 2112,
 1000180390,
 11,
 2212,
 2212,
 2000000002,
 2000000101,
 14,
 1000180400,
 2212,
 1000170390,
 14,
 2214,
 2212,
 111,
 2212,
 111,
 2212,
 2000000002,
 12,
 ...]

ясно, если я правильно напишу свой код, первое значение в моем новом pdg_entсписок должен быть 9, а второй должен быть 13 и т. д ...

вот вывод pdg_ent

[9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 9,
 ...]

, почему python добавляет новый список только с первым экземпляромзначение 14 из старого списка?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019
i = 0
for x in pdg_vals :
    if x == 14 :
        print(i)
    i += 1

Это будет работать для вашего конкретного сценария.ОДНАКО, если вам нужно отсортировать в порядке возрастания, ваш поиск будет намного быстрее с двоичным поиском.

0 голосов
/ 22 сентября 2019

Функция 'index' - это не то, что вам нужно

pdg_vals.index (x), как гласит документация , "Возвращает основанный на нуле индекс в списке first item, значение которого равно x "- который в вашем случае равен 9, когда x равен 14. Так что, если вы не хотите возвращать первое значение, это не то, что вам нужно.

enumerate

Функция перечисления (https://docs.python.org/3/tutorial/datastructures.html#looping-techniques), кажется, вам нужна:

for index, value in enumerate(list):
  if value == 14:
     print(index)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...