복붙노트

[PYTHON] 파이썬 - 문자열에서 문자를 찾으십시오 - 모든 색인을 가져올 수 있습니까?

PYTHON

파이썬 - 문자열에서 문자를 찾으십시오 - 모든 색인을 가져올 수 있습니까?

나는 간단한 코드를 가지고있다 :

def find(str, ch):
    for ltr in str:
        if ltr == ch:
            return str.index(ltr)
find("ooottat", "o")

이 함수는 첫 번째 인덱스 만 반환합니다. 인쇄물 반환을 변경하면 0 0 0이 인쇄됩니다. 이유가 무엇이며 0 1 2를 얻는 방법이 있습니까?

해결법

  1. ==============================

    1.이는 str.index (ch)가 처음으로 ch가 발생한 인덱스를 반환하기 때문입니다. 시험:

    이는 str.index (ch)가 처음으로 ch가 발생한 인덱스를 반환하기 때문입니다. 시험:

    def find(s, ch):
        return [i for i, ltr in enumerate(s) if ltr == ch]
    

    이렇게하면 필요한 모든 색인의 목록이 반환됩니다.

    추신 Hugh의 대답은 생성자 함수를 보여줍니다 (인덱스 목록이 커질 수 있다면 차이가 있음). 이 기능은 []를 ()로 변경하여 조정할 수도 있습니다.

  2. ==============================

    2.나는 Lev와 함께 할 것이지만, 더 복잡한 검색으로 끝나면 re.finditer를 사용하는 것이 가치가있을 수 있음을 지적 할 가치가 있습니다. (그러나 종종 re는 가치보다 더 많은 문제를 야기합니다 - 그러나 때때로 알기에는 편리합니다)

    나는 Lev와 함께 할 것이지만, 더 복잡한 검색으로 끝나면 re.finditer를 사용하는 것이 가치가있을 수 있음을 지적 할 가치가 있습니다. (그러나 종종 re는 가치보다 더 많은 문제를 야기합니다 - 그러나 때때로 알기에는 편리합니다)

    test = "ooottat"
    [ (i.start(), i.end()) for i in re.finditer('o', test)]
    # [(0, 1), (1, 2), (2, 3)]
    
    [ (i.start(), i.end()) for i in re.finditer('o+', test)]
    # [(0, 3)]
    
  3. ==============================

    3.

    def find_offsets(haystack, needle):
        """
        Find the start of all (possibly-overlapping) instances of needle in haystack
        """
        offs = -1
        while True:
            offs = haystack.find(needle, offs+1)
            if offs == -1:
                break
            else:
                yield offs
    
    for offs in find_offsets("ooottat", "o"):
        print offs
    

    ~에 결과

    0
    1
    2
    
  4. ==============================

    4.Lev의 대답은 제가 사용하려고했던 것입니다. 그러나 여기에 원래 코드를 기반으로 한 것이 있습니다 :

    Lev의 대답은 제가 사용하려고했던 것입니다. 그러나 여기에 원래 코드를 기반으로 한 것이 있습니다 :

    def find(str, ch):
        for i, ltr in enumerate(str):
            if ltr == ch:
                yield i
    
    >>> list(find("ooottat", "o"))
    [0, 1, 2]
    
  5. ==============================

    5.너는 이것을 시도 할 수 있었다.

    너는 이것을 시도 할 수 있었다.

    def find(ch,string1):
        for i in range(len(string1)):
            if ch == string1[i]:
                pos.append(i)        
    
  6. ==============================

    6.팬더를 사용하여 우리는 이것을 할 수 있고 모든 인덱스를 가진 dict을 반환 할 수 있습니다. 간단한 버전 :

    팬더를 사용하여 우리는 이것을 할 수 있고 모든 인덱스를 가진 dict을 반환 할 수 있습니다. 간단한 버전 :

    import pandas as pd
    
    d = (pd.Series(l)
         .reset_index()
         .groupby(0)['index']
         .apply(list)
         .to_dict())
    

    그러나 우리는 조건을 구축 할 수도 있습니다. 2 회 이상 발생하는 경우에만 :

    d = (pd.Series(l)
         .reset_index()
         .groupby(0)['index']
         .apply(lambda x: list(x) if len(list(x)) > 1 else None)
         .dropna()
         .to_dict())
    
  7. ==============================

    7.

    x = "abcdabcdabcd"
    print(x)
    l = -1
    while True:
        l = x.find("a", l+1)
        if l == -1:
            break
        print(l)
    
  8. from https://stackoverflow.com/questions/11122291/python-find-char-in-string-can-i-get-all-indexes by cc-by-sa and MIT license