программирование на Python ... перекодирование каждого элемента в списке на основе теста условной логики - PullRequest
0 голосов
/ 10 марта 2019

У меня вопрос по питону.Учитывая список, подобный этому: mylist=[21,35,38,41,10,9] как я могу написать код для создания нового списка, который выполняет некоторую условную логику для каждого элемента mylist.Логика, которую я хочу применить, основана на этой интуиции:

if mylist[i] < mylist[i+1] then 1 else 0.

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

re_code=[1,1,1,0,0] (yes len(re_code) = len (mylist) - 1)

I тогдахотел бы извлечь индексы элементов с 0, если это возможно.Так что список как этот = index=[4,5].Я надеюсь, способ, которым я объяснил это, имеет смысл.

Я пробовал что-то подобное, но это не работает:

for i in mylist:
    re_code=[i for i in mylist]
    re_code[i]=[1 if mylist[i]< mylist[i +1] else  0]
    return(re_code)

Любая помощь будет признательна.

Ответы [ 4 ]

0 голосов
/ 10 марта 2019

Может быть, для начинающего может быть проще понять простой for-loop?

mylist = [21,35,38,41,10,9]
iterlist = iter(mylist[1:]) # create an iterator from your list minus first element
result = []

for i in mylist:
    try:
        if i < next(iterlist): # compare current val with val in front of it
            result.append(1)
        else:
            result.append(0)
    except StopIteration: # if there's nothing left in the iterator end the loop
        break

print(result)

[1, 1, 1, 0, 0]
0 голосов
/ 10 марта 2019

Ваш код почти там всего пара точек.

Возможно, будет проще выполнять итерации по списку, используя индекс, а не обращаться к элементу за раз, поэтому что-то вроде:

for i in range(len(mylist) - 1):  # notice we iterate up to the second to last element

И затем вы можете получить доступ к списку, используя i в качестве индекса внутри цикла, например, mylist[i].

В настоящее время for i in mylist даст вам фактические элементы, а не их индекс.

Наконец, вы, вероятно, хотите отслеживать индексы, поэтому просто сохраните i в списке для этой цели.

Имеет ли это смысл?

0 голосов
/ 10 марта 2019

Pythonic способ сделать это состоит в том, чтобы использовать zip с пониманием списка, который вообще не использует индексы, чтобы получить re_code, затем enumerate, чтобы снова получить индексы для index.

mylist=[21,35,38,41,10,9]

re_code = [int(a < b) for a, b in zip(mylist, mylist[1:])]
index = [i for i, v in enumerate(re_code) if v == 0]

print(re_code)
print(index)

Распечатка с этого

[1, 1, 1, 0, 0]
[3, 4]

Если вам просто нужно значение index и вам не нужно re_code, это можно сделать только в одном понимании списка. Спросите, хотите ли вы, чтобы я показал это.

zip объединяет последовательные элементы в списке. Если список очень длинный или если он может быть итеративным, а не списком, вам следует использовать pairwise рецепт из документации itertools вместо zip.

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)
0 голосов
/ 10 марта 2019

Вы можете использовать список-понимание:

mylist = [21,35,38,41,10,9]

re_code = [int(mylist[i] < mylist[i+1]) for i in range(len(mylist) - 1)]

print(re_code) # ==> [1, 1, 1, 0, 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...