繁体   English   中英

特定文字的列表中的Python计数更改

[英]Python count change in list for specific text

我试图弄清楚如何计算列表中状态或字符串的变化。 例如,这是一个列表...

ABC ABC ABC xyz xyz xyz ABC ABC xyz ABC

我想记下从ABC到xyz的变化。 因此,对于此示例,当从ABC更改为xyz两次时,计数将为2。

谢谢。

为此使用str.count 如果必须在列表中的xyz之前计算ABC ,则可以将其加入并应用str.count方法:

abc_list = ['ABC', 'ABC', 'ABC', 'xyz', 'xyz', 'xyz', 'ABC', 'ABC', 'xyz' 'ABC']
abc_string = ''.join(abc_list)
print abc_string.count('ABCxyz')

上面的方法很简单,但是如果您有类似['AB','C','xyz']之类的列表,则无法使用,在这种情况下,您可以简单地对某个字符串进行联接,并将该字符串包括在内:

abc_string = '!!!'.join(abc_list)
print abc_string.count('ABC!!!xyz')

counter = 0
for index, item in enumerate(abc_list):
  if index < len(abc_list) and item == 'ABC' and abc_list[index+1] == 'xyz':
    counter += 1

这样的事情会起作用:

counter = 0
for i in range(len(input_list) - 1):
    if input_list[i] == "ABC" and input_list[i + 1] == "xyz":
        counter += 1

或者,您可以使用内置的Counter

from collections import Counter

a = ['ABC', 'ABC', 'ABC', 'xyz', 'xyz', 'xyz', 'ABC', 'ABC', 'xyz', 'ABC']

print {(k1, k2): val for (k1, k2), val in Counter([(a[i], a[i+1]) for i in range(len(a)-1)]).iteritems() if k1 != k2}

>>> {('ABC', 'xyz'): 2, ('xyz', 'ABC'): 2}

difflib的SequenceMatcher似乎是一个很好的工具。

from difflib import SequenceMatcher

haystack = 'ABC ABC ABC xyz xyz xyz ABC ABC xyz ABC xyz ABC DCE ABC xyz'.split()
haystack_sz = len(haystack)

needle = ['ABC', 'xyz']
needle_sz = len(needle)

s = SequenceMatcher(None, needle, haystack)

m = s.find_longest_match(0, needle_sz, 0, haystack_sz)
print m # just for debug

count = 0

while m.size == needle_sz:
   count += 1
   m = s.find_longest_match(0, needle_sz, m.b + m.size, haystack_sz)
   print m # just for debug

print count

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM