Получить первый индекс списка, содержащий подстроку?

Это должно дать результаты, которые вы ищете. Надеюсь, это поможет.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="utf-8"/>

  <xsl:template match="particular-tag">
    <particular-tag>
      <xsl:apply-templates select="element">
        <xsl:sort select="@attrib"/>
      </xsl:apply-templates>
    </particular-tag>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:choose>
      <xsl:when test="node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy>
          <xsl:apply-templates select="@*"/>
        </xsl:copy>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>
30
задан martineau 1 August 2017 в 16:21
поделиться

6 ответов

Нелицензионный метод:

def index_containing_substring(the_list, substring):
    for i, s in enumerate(the_list):
        if substring in s:
              return i
    return -1
33
ответ дан kennytm 27 November 2019 в 23:57
поделиться

Вариант решения для абикса (оптимизирован для остановки при обнаружении совпадения)

def first_substring(strings, substring):
    return next(i for i, string in enumerate(strings) if substring in string)

Если вы до 2.6, вам нужно поставить next() в конце

def first_substring(strings, substring):
    return (i for i, string in enumerate(strings) if substring in string).next()
3
ответ дан John La Rooy 27 November 2019 в 23:57
поделиться
  >>> li = ['my','array','with','words']
  >>> reduce(lambda tup, word: (tup[0], True) if not tup[1] and word  == 'my' else (tup[0]+1 if not tup[1] else tup[0], tup[1]), li, (0, False))[0]
  0
  >>> reduce(lambda tup, word: (tup[0], True) if not tup[1] and word  == 'words' else (tup[0]+1 if not tup[1] else tup[0], tup[1]), li, (0, False))[0]
  3
1
ответ дан Pawel 27 November 2019 в 23:57
поделиться

Это довольно слон и довольно эффективно.

>>> def find(lst, predicate):
...     return (i for i, j in enumerate(lst) if predicate(j)).next()
... 
>>> l = ['the cat ate the mouse','the tiger ate the chicken','the horse ate the straw']
>>> find(l, lambda x: 'tiger' in x)
1

Только проблема заключается в том, что она повысит сложность, если товар не найден (хотя это легко исправлена).

2
ответ дан 27 November 2019 в 23:57
поделиться
def find(l, s):
    for i in range(len(l)):
        if l[i].find(s)!=-1:
            return i
    return None # Or -1
.
2
ответ дан 27 November 2019 в 23:57
поделиться
def first_substring(strings, substring):
    return min(i for i, string in enumerate(strings) if substring in string)

Примечание: это повысит ValueError в случае, если совпадение не найдено, что лучше на мой взгляд.

2
ответ дан 27 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

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