Сравнение элементов списка - PullRequest
1 голос
/ 25 октября 2019

дано, li=[6,1,5,1,3,1] Теперь я хочу проверить, является ли элемент списка больше или равен всем последующим элементам. Поэтому мой требуемый ответ должен быть 6,5,3,1 Пожалуйста, помогите. Запрос ответа, чтобы быть «непитонным» лол. Я пробовал это,

for i in range(len(li)):
    for j in li[i+1:]:
        if li[i]>j:
            print(li[i])
            break

Это работает частично, но не в таких сценариях, как [6,1,5,1,3,1,1], где я также хочу 1 в качестве ответа

Ответы [ 4 ]

2 голосов
/ 25 октября 2019

Более эффективный подход с временной сложностью O (n) состоит в том, чтобы вместо этого выполнять итерацию по списку в обратном порядке, поэтому проблема может заключаться в простом определении, является ли текущий элемент больше илиравный последнему элементу в выводе, а затем снова инвертируйте вывод в конце:

output = [li.pop()]
for i in reversed(li):
    if i >= output[-1]:
        output.append(i)
output = output[::-1]

output становится:

[6, 5, 3, 1]
0 голосов
/ 25 октября 2019

Это должно вернуть ожидаемый результат:

li=[6,1,5,1,3,1]
filtered = []
for i, val in enumerate(li):
 for r in li[i+1:]:
  if val > r:
   continue
  else:
   break
 else:
  filtered.append(val)
print(filtered)
0 голосов
/ 25 октября 2019

Добро пожаловать в переполнение стека! Я видел, что вы отредактировали, чтобы добавить некоторый код, который доказал, что вы пробовали, спасибо за это, нам нравится видеть больше этого!

Однако ваша попытка имеет сложность времени O(N ^ 2), поскольку вы запускаете цикл for длины (li) с вложенным циклом длины (li) - 1, что означает для каждого символа в li, вы должны пройти len(li) раз , что медленно.

Это «непитоновский» способ сделать это, он проходит только через li один раз и довольно просто:

li=[6,1,5,1,3,1,1]
prev = li[0] # first element
output = []
for i in range(1, len(li)):
    if(prev >= li[i]):
        output.append(prev)
    prev = li[i]

print(output)

Вывод:

[6, 5, 3, 1]

ПРИМЕЧАНИЕ : После дополнительного прочтения вашего вопроса я понял, что, возможно, неверно истолковал ваш вопрос.

Теперь я хочу проверить, является ли элемент списка больше или равен всем последующим элементам.

Я не заметил, что «все»,и я прошу прощения за это.

Я могу сделать это "pythonic-ish", используя нарезку списка:

li=[6,1,5,1,3,1,1]
output=[]
for i in range(0, len(li)):
    if(len(li[i+1:]) == 0): #if last element
        break # you can choose to count this in or not
    if(li[i] >= max(li[i+1:])): # if current element larger or equals max of ALL successive elements
        output.append(li[i])

print(output)

Вывод (все тот же):

[6, 5, 3, 1]

Теперь в этом решении временная сложность будет O (N ^ 2), потому что max - это O (N) -функция, и она вызывается N раз, в результате чего O (N * N) = O (N ^ 2) время

0 голосов
/ 25 октября 2019

Вот как я это решил:

li = [6, 1, 5, 1, 3, 1]

result = []

for i in li:
    index = li.index(i)
    if index is 0:
        continue
    if index is len(li) - 1:
        continue
    if li[index - 1] <= i => li[index + 1]:
        result.append(i)
 print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...