найти последнее число в списке с последовательным числом чисел больше, чем & ldquo; n & rdquo;

Вы должны внимательно прочитать документы, в частности раздел Анализ XML с пространством имен , который включает в себя пример, который почти точно вы хотите.

Но даже без docs, ответ действительно содержится в вашем примере вывода. Когда вы печатали корневой элемент вашего документа ...

>>> tree = etree.parse(open('data.xml'))
>>> root = tree.getroot()
>>> root

... вы можете видеть, что он напечатал имя корневого элемента (DocuSignEnvelopeInformation) с префиксом пространства имен ({http://www.docusign.net/API/3.0}). Вы можете использовать тот же префикс, что и часть вашего аргумента, в findall:

>>> root.findall('{http://www.docusign.net/API/3.0}Email')

Но это само по себе не будет работать, так как это найдет только элементы Email, которые являются непосредственными дочерними элементами корневой элемент. Вам необходимо предоставить выражение ElementPath , чтобы findall выполнил поиск всего документа. Это работает:

>>> root.findall('.//{http://www.docusign.net/API/3.0}Email')
[]

Вы также можете выполнить аналогичный поиск с использованием XPath и префиксов пространства имен, например:

>>> root.xpath('//docusign:Email',
... namespaces={'docusign': 'http://www.docusign.net/API/3.0'})
[]

Это позволяет использовать префиксы XML namespace: вместо синтаксиса пространства имен LXML.

0
задан jason 13 July 2018 в 19:55
поделиться

5 ответов

Попробуйте сначала reverse список и запустите iterating над ним

Пометить first number, что вы нашли и начали отсчет последовательных номеров после него

If, который вы получили None перед тем, как счетчик больше n, а затем сбросить счетчик, отметьте next number after None и продолжите итерацию.

Else, ваш отмеченный номер является ответом:)

Код для этого ниже:

def find_the_number(the_list, n):
    counter = 0
    possible_answer = None
    for i in reversed(the_list):
        if i is not None:
            if counter == 0:
                possible_answer = i
            counter += 1
        else:
            counter = 0
        if counter > n:
            return possible_answer


mixed_list = [None, 1, 3, None, 5, 6, 7, 8, 10, None, None, 11, 12, None, None]
cons_number = 2
print(find_the_number(mixed_list, cons_number))
5
ответ дан Igor S 17 August 2018 в 12:10
поделиться
  • 1
    Я думал о решении itertools.groupby, но это намного лучше. – pault 13 July 2018 в 20:07
  • 2
    @Igor S. Как получилось, что это не работает? a=[None, None, None, None, None, None, None, 40696.0, 43431.0, 46489.0, 48979.0, 53985.0, None, None, None, None, None, 80643.0, 87583.0, 91965.0, 105299.0, 117507.0, None, None, None, None, 0.62, 0.55, 0.43, 0.4, 0.46, None, None, None, None, 1.41, 1.31, 1.22, 1.18, 1.32, None, None, None, None, None, None, None, None, None, None, None, None, None, None], если я использую ваш код, он возвращает 1.32 должен быть 53985.0 – jason 26 July 2018 в 21:46
  • 3
    @jason 1.32 - это последнее число в этом списке с последовательным числом чисел больше 2. Так же, как вы задали вопрос. 53985.0 будет ответом, если вы запросили последний номер в первой последовательности, который имеет более 2 последовательных номеров – Igor S 27 July 2018 в 12:40

Я бы использовал itertools.groupby в обратном списке.

from itertools import groupby

n = 2
lst = [None, 1, 3, None, 5, 6, 7, 8, 10, None, None, 11, 12, None, None]
groups = groupby(reversed(lst), lambda x: isinstance(x, int))
result = next((grplist[0] for p, grp in groups
                          for grplist in [list(grp)] 
                          if p and len(grplist) > n), None)
1
ответ дан Adam Smith 17 August 2018 в 12:10
поделиться
  • 1
    Это также использует некоторый Hacky for alias in [something_else] синтаксис, который будет сделан устаревшим спорным новое := синтаксис утвержденного Гвидо. – Adam Smith 13 July 2018 в 20:37

Я принял ответ, но понял, что он понял меня, но благодаря Игорю С. я изменил его код, и это работает.

def get_last_number2(list, n=2):
    counter = 0
    possible_answer = None

    for i in list:
      if i is not None:
         possible_answer = i
         counter +=1
      else:
         if counter>n:
            return possible_answer
         counter = 0
0
ответ дан jason 17 August 2018 в 12:10
поделиться
>>> next((v[-1] for v in reversed(list(zip(*[mixed_list[i:] for i in range(n+1)]))) if all(v)), None)
>>> 10

Объяснение

zip(*[mixed_list[i:] for i in range(n+1) вернет n + 1 последовательных чисел в качестве кортежа

>>> list(zip(*[mixed_list[i:] for i in range(n+1)]))
[(None, 1, 3), (1, 3, None), (3, None, 5), (None, 5, 6), (5, 6, 7), (6, 7, 8), (7, 8, 10), (8, 10, None), (10, None, None), (None, None, 11), (None, 11, 12), (11, 12, None), (12, None, None)]

Затем вы отмените его

>>> list(reversed(list(zip(*[mixed_list[i:] for i in range(n+1)]))))
[(12, None, None), (11, 12, None), (None, 11, 12), (None, None, 11), (10, None, None), (8, 10, None), (7, 8, 10), (6, 7, 8), (5, 6, 7), (None, 5, 6), (3, None, 5), (1, 3, None), (None, 1, 3)]

Затем вы фильтруете его только тогда, когда кортеж содержит все числа и возвращает только первое число из кортежа

>>> [v[-1] for v in reversed(list(zip(*[mixed_list[i:] for i in range(n+1)]))) if all(v)]
[10, 8, 7]

. Все, что вам нужно сделать, это получить первое число из возвращаемого списка:)

2
ответ дан Sunitha 17 August 2018 в 12:10
поделиться
  • 1
    Извините ... Я неправильно понял этот вопрос. Спасибо за комментарий. Я теперь исправил ответ – Sunitha 13 July 2018 в 20:29
  • 2
    Возможное улучшение - используйте next(.., default=None) вместо индексации этого списка: next((v[-1] for v in reversed(list(zip(*[mixed_list[i:] for i in range(n+1)]))) if all(v)), None) - это будет быстрее и надежнее в случае, когда такое значение не существует. Также, пожалуйста, отредактируйте свой ответ, чтобы добавить больше объяснений! – pault 13 July 2018 в 20:34
  • 3
    @pault .. Спасибо ... Обновлен ответ – Sunitha 13 July 2018 в 20:40
  • 4
    Вау. это безумие, вы можете получить его в одной строке кода. – jason 14 July 2018 в 00:03
  • 5
    @Sunitha. Если я попробую пример, как в комментарии выше для принятого ответа, ваше решение также возвращает 1.32 вместо 53985.0 – jason 26 July 2018 в 21:53

Что-то вроде этого должно работать. Предостережение: непроверенный только что напечатан здесь

minimum_consecutives = 2
mixed_list = [None, 1, 3, None, 5, 6, 7, 8, 10, None, None, 11, 12, None, None]
consecutive_non_nulls = 0
last_item = None
for item in mixed_list:
   if item is not None:
       consecutive_non_nulls = consecutive_non_nulls + 1
   else:
       if consecutive_non_nulls > minimum_consecutives:
           break;
       consecutive_non_nulls = 0
   last_item = item
print(last_item)
1
ответ дан voglster 17 August 2018 в 12:10
поделиться
  • 1
    OP заявила последний элемент! ex: [ 7, 8, 10, None, None, 11, 12, 13, None] все еще возвращает 10, должно быть 13. – corn3lius 13 July 2018 в 20:20
Другие вопросы по тегам:

Похожие вопросы: