Большинство pythoni c способ найти связь между двумя элементами в списке - PullRequest
0 голосов
/ 29 марта 2020

Допустим, у меня есть следующий список:

l = ["watermelon", "banana", "orange", "apple"]

И я хочу написать функцию, которая возвращает любой элемент перед другим элементом в списке. например:

>> is_before("banana", "watermelon")
>> False
>> is_before("banana", "apple")
>> True

Какой самый питон c способ написания такой функции?

Ответы [ 2 ]

3 голосов
/ 29 марта 2020

Вы можете сделать (при условии, что дубликатов нет):

l = ["watermelon", "banana", "orange", "apple"]

indeces = {w: i for i, w in enumerate(l)}

def is_previous(x, y):
    return indeces[x] < indeces[y]

>>> is_previous("banana", "watermelon")
False
>>> is_previous("banana", "apple")
True

Это не относится к случаю, когда какой-либо из аргументов отсутствует в исходном списке.

1 голос
/ 29 марта 2020
mylist = ["watermelon", "banana", "orange", "apple"]

def is_before(prev_item, target, arr):
    return prev_item in arr[:arr.index(target)]

>>>is_before("banana", "apple", mylist)
True
>>>is_before("banana", "watermelon", mylist)
False

Если вы хотите обрабатывать дубликаты, вы можете использовать что-то вроде этого

def find_item_last_index(count, item, arr, index=0):
    # A recursive function for finding the last index of an item in a list
    if count == 1:
        return index + arr.index(item)
    return (find_item_last_index(count-1, item, arr[arr.index(item)+1:],  
                                 index+arr.index(item)+1))

def is_before(prev_item, target, arr):
    return prev_item in arr[: find_item_last_index(arr.count(target), target, arr)]

mylist =  ["watermelon", "apple", "banana", "orange", "apple"]

>>>is_before("banana", "apple", mylist)
True
>>>is_before("banana", "watermelon", mylist)
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...