Вставить значения в середину списка на основе определенного условия - PullRequest
0 голосов
/ 11 июля 2020

У меня есть список под названием category, который имеет следующие значения.

`category=['Constant', 'Constant', 'Constant', 'Constant', 'Categorical', 'Categorical', 'Categorical', 'Categorical', 'Categorical', 'Constant', 'Constant', 'Categorical', 'Constant', 'Categorical', 'Categorical', 'Categorical', 'Categorical', 'Categorical', 'Constant', 'Categorical', 'Categorical', 'Categorical']`

Мне нужно go через этот список, создать новый список и вставить значения с именем «None», где значения «Constant» '. Но в моем случае я могу вставить «Нет» только в начале (для первых 4 значений), не могу вставить «Нет» в середине списка. (Например: я хочу напечатать «Нет» на 10-й, 11-й, 13-й позиции). Можете ли вы посмотреть на мой код и сказать, какую ошибку я делаю.

distinct = []
for x in category:
    if x == 'Constant':
        distinct.append('None')
    elif x == 'Categorical':
        distinctvalue = driver.find_elements_by_xpath("My XPath has list of items")
        for dv in distinctvalue:
            distval = dv.text
            distinct.append(distval)
        break
print(distinct)

O / P: У меня есть ['None', 'None', 'None', 'None', '1027', '1117', '2', '1117', '1027', '2', '2', '26', '2', '363', '96', '363', '339545', '96']

Ожидаемое O / P: ['None', 'None', 'None', 'None', '1027', '1117', '2', '1117', '1027','None','None', '2', 'None', '2', '26', '2', '363', '96','None', '363', '339545', '96']

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Удалите 'break' из вашего блока elif кода

elif x == 'Categorical':
    distinctvalue = driver.find_elements_by_xpath("My XPath has list of items")
    for dv in distinctvalue:
        distval = dv.text
        distinct.append(distval)
    break # remove this
0 голосов
/ 11 июля 2020

Не пытайтесь сделать все l oop внутри вашего elif - вместо этого получите следующее значение из списка, когда оно вам нужно.

Есть два способа сделать это:

Путем индексации списка.

Используйте индексную переменную (здесь i), чтобы отслеживать, где вы достигли в списке:

distinct = []
distinctvalue = driver.find_elements_by_xpath("My XPath has list of items")

i = 0  # <== initialise the index variable
for x in category:
    if x == 'Constant':
        distinct.append('None')
    elif x == 'Categorical':
        dv = distinctvalue[i]  # <== use the index variable to look up next value
        i += 1  # <== increment the counter ready for next time
        distval = dv.text
        distinct.append(distval)
print(distinct)

Если у вас могут закончиться различные значения раньше, вы можете добавить для этого уловку, чтобы, если он пытается получить следующее значение, а его нет, он будет break из l oop вместо - замените:

        dv = distinctvalue[i]

на:

        try:
            dv = distinctvalue[i]
        except IndexError:
            break

Используя итератор.

На этот раз мы используем iter для создания итератора из списка и используйте next, чтобы получить следующее значение от этого итератора:

distinct = []
distinctvalue = iter(driver.find_elements_by_xpath("My XPath has list of items"))  # <== get the iterator

for x in category:
    if x == 'Constant':
        distinct.append('None')
    elif x == 'Categorical':
        dv = next(distinctvalue)  # <== next one
        distval = dv.text
        distinct.append(distval)
print(distinct)

На этот раз, чтобы выйти из l oop раньше, если у вас закончатся значения, вы должны заменить:

        dv = next(distinctvalue)

с:

        try:
            dv = next(distinctvalue)
        except StopIteration:
            break
...