On 4/23/2019 2:44 AM, 林自均 wrote:
Hi all,
I found that there are str.index() and str.rindex(), but there is only
list.index() and no list.rindex().
str.index and list.index are related but not the same. The consistency
argument is better applied to find-rfind, index-rindex,
partition-rpartition, etc.
It is much more common to process strings right to left or in both
directions, than process lists right to left or in both directions.
Moreover, lists have a reverse method, strings do not.
''.join(reversed(somestring)) is likely slower, especially if there many
non-ascii chars. Moreover, somestring.rindex(substring) would have to
have both somestring and substring reversed when substring is more than
one char.
So I filed the issue
https://bugs.python.org/issue36639 to provide list.rindex(). However,
the issue was rejected and closed with the comment:
> There were known, strong use cases for str.rindex(). The
list.rindex() method was intentionally omitted. AFAICT no compelling
use cases have arisen, so we should continue to leave it out. In
general, we don't grow the core APIs unnecessarily.
However, I am not sure what the known, strong use cases for str.rindex()
are. Why doesn't the strong use cases apply on list.rindex()? Could
anyone give me some examples? Thanks.
Omitting tests of rindex and rfind themselves:
Searching 'rindex' in C:\Programs\Python38\lib\*.py ...
C:\Programs\Python38\lib\_markupbase.py: 55: pos =
rawdata.rindex("\n", i, j) # Should not fail
C:\Programs\Python38\lib\collections\__init__.py: 1260: def
rindex(self, sub, start=0, end=_sys.maxsize):
C:\Programs\Python38\lib\collections\__init__.py: 1261: return
self.data.rindex(sub, start, end)
C:\Programs\Python38\lib\pydoc_data\topics.py: 10125:
'str.rindex(sub[, start[, end]])\n'
C:\Programs\Python38\lib\test\pickletester.py: 2543:
self.assertEqual((pickled.rindex(b"abcd") + len(b"abcd") -
C:\Programs\Python38\lib\test\pickletester.py: 2574:
self.assertEqual((pickled.rindex(b"abcd") + len(b"abcd") -
C:\Programs\Python38\lib\test\test_baseexception.py: 46:
depth = exc_line.rindex('-')
C:\Programs\Python38\lib\test\test_bigmem.py: 310:
self.assertEqual(s.rindex(_(' ')),
C:\Programs\Python38\lib\test\test_bigmem.py: 311:
sublen + size + SUBSTR.rindex(_(' ')))
C:\Programs\Python38\lib\test\test_bigmem.py: 312:
self.assertEqual(s.rindex(SUBSTR), sublen + size)
C:\Programs\Python38\lib\test\test_bigmem.py: 313:
self.assertEqual(s.rindex(_(' '), 0, sublen + size - 1),
C:\Programs\Python38\lib\test\test_bigmem.py: 314:
SUBSTR.rindex(_(' ')))
C:\Programs\Python38\lib\test\test_bigmem.py: 315:
self.assertEqual(s.rindex(SUBSTR, 0, sublen + size), 0)
C:\Programs\Python38\lib\test\test_bigmem.py: 316:
self.assertEqual(s.rindex(_('i')),
C:\Programs\Python38\lib\test\test_bigmem.py: 317:
sublen + size + SUBSTR.rindex(_('i')))
C:\Programs\Python38\lib\test\test_bigmem.py: 318:
self.assertEqual(s.rindex(_('i'), 0, sublen), SUBSTR.rindex(_('i')))
C:\Programs\Python38\lib\test\test_bigmem.py: 319:
self.assertEqual(s.rindex(_('i'), 0, sublen + size),
C:\Programs\Python38\lib\test\test_bigmem.py: 320:
SUBSTR.rindex(_('i')))
C:\Programs\Python38\lib\test\test_bigmem.py: 321:
self.assertRaises(ValueError, s.rindex, _('j'))
C:\Programs\Python38\lib\test\test_bytes.py: 566:
self.assertEqual(b.rindex(b'ss'), 5)
C:\Programs\Python38\lib\test\test_bytes.py: 567:
self.assertRaises(ValueError, b.rindex, b'w')
C:\Programs\Python38\lib\test\test_bytes.py: 568:
self.assertRaises(ValueError, b.rindex, b'mississippian')
C:\Programs\Python38\lib\test\test_bytes.py: 570:
self.assertEqual(b.rindex(i), 10)
C:\Programs\Python38\lib\test\test_bytes.py: 571:
self.assertRaises(ValueError, b.rindex, w)
C:\Programs\Python38\lib\test\test_bytes.py: 573:
self.assertEqual(b.rindex(b'ss', 3), 5)
C:\Programs\Python38\lib\test\test_bytes.py: 574:
self.assertEqual(b.rindex(b'ss', 0, 6), 2)
C:\Programs\Python38\lib\test\test_bytes.py: 576:
self.assertEqual(b.rindex(i, 1, 3), 1)
C:\Programs\Python38\lib\test\test_bytes.py: 577:
self.assertEqual(b.rindex(i, 3, 9), 7)
C:\Programs\Python38\lib\test\test_bytes.py: 578:
self.assertRaises(ValueError, b.rindex, w, 1, 3)
C:\Programs\Python38\lib\test\test_bytes.py: 768:
self.assertEqual(3, b.rindex(l, None))
C:\Programs\Python38\lib\test\test_bytes.py: 769:
self.assertEqual(3, b.rindex(l, -2, None))
C:\Programs\Python38\lib\test\test_bytes.py: 770:
self.assertEqual(2, b.rindex(l, None, -2))
C:\Programs\Python38\lib\test\test_bytes.py: 771:
self.assertEqual(0, b.rindex(h, None, None))
C:\Programs\Python38\lib\test\test_bytes.py: 791: for method in
(b.count, b.find, b.index, b.rfind, b.rindex):
C:\Programs\Python38\lib\test\test_bytes.py: 806:
self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
C:\Programs\Python38\lib\test\test_descr.py: 3596: try:
''.rindex('5')
C:\Programs\Python38\lib\test\test_descr.py: 3598: else:
self.fail("''.rindex('5') doesn't raise ValueError")
Searching 'rfind' in C:\Programs\Python38\lib\*.py ...
C:\Programs\Python38\lib\collections\__init__.py: 1256: def
rfind(self, sub, start=0, end=_sys.maxsize):
C:\Programs\Python38\lib\collections\__init__.py: 1259: return
self.data.rfind(sub, start, end)
C:\Programs\Python38\lib\ctypes\macholib\dyld.py: 143: fmwk_index =
fn.rfind('.framework')
C:\Programs\Python38\lib\doctest.py: 341: i = msg.rfind('.', 0, end)
C:\Programs\Python38\lib\email\_parseaddr.py: 76: i =
data[0].rfind(',')
C:\Programs\Python38\lib\encodings\punycode.py: 187: pos =
text.rfind(b"-")
C:\Programs\Python38\lib\formatter.py: 401: i = data.rfind('\n')
C:\Programs\Python38\lib\genericpath.py: 124: sepIndex = p.rfind(sep)
C:\Programs\Python38\lib\genericpath.py: 126: altsepIndex =
p.rfind(altsep)
C:\Programs\Python38\lib\genericpath.py: 129: dotIndex = p.rfind(extsep)
C:\Programs\Python38\lib\html\parser.py: 148: amppos
= rawdata.rfind('&', max(i, n-34))
C:\Programs\Python38\lib\html\parser.py: 336: -
self.__starttag_text.rfind("\n")
C:\Programs\Python38\lib\http\client.py: 873: i =
host.rfind(':')
C:\Programs\Python38\lib\http\client.py: 874: j =
host.rfind(']') # ipv6 addresses have [...]
C:\Programs\Python38\lib\http\cookiejar.py: 566: i = A.rfind(B)
C:\Programs\Python38\lib\http\cookiejar.py: 1016: i =
domain.rfind(".")
C:\Programs\Python38\lib\http\cookiejar.py: 1017: j =
domain.rfind(".", 0, i)
C:\Programs\Python38\lib\http\cookiejar.py: 1507: i =
path.rfind("/")
C:\Programs\Python38\lib\idlelib\pyparse.py: 161: i =
code.rfind(":\n", 0, limit)
C:\Programs\Python38\lib\idlelib\pyparse.py: 164: i =
code.rfind('\n', 0, i) + 1 # start of colon line (-1+1=0)
C:\Programs\Python38\lib\idlelib\pyparse.py: 379: p =
code.rfind('\n', 0, p-1) + 1
C:\Programs\Python38\lib\idlelib\pyparse.py: 477: origi = i =
code.rfind('\n', 0, j) + 1
C:\Programs\Python38\lib\json\decoder.py: 33: colno = pos -
doc.rfind('\n', 0, pos)
C:\Programs\Python38\lib\logging\__init__.py: 1340: i =
name.rfind(".")
C:\Programs\Python38\lib\logging\__init__.py: 1353: i =
name.rfind(".", 0, i - 1)
C:\Programs\Python38\lib\modulefinder.py: 155: i =
pname.rfind('.')
C:\Programs\Python38\lib\modulefinder.py: 509: i =
name.rfind(".")
C:\Programs\Python38\lib\pathlib.py: 791: i = name.rfind('.')
C:\Programs\Python38\lib\pathlib.py: 810: i = name.rfind('.')
C:\Programs\Python38\lib\pdb.py: 629: colon = arg.rfind(':')
C:\Programs\Python38\lib\pdb.py: 884: i = arg.rfind(':')
C:\Programs\Python38\lib\posixpath.py: 109: i = p.rfind(sep) + 1
C:\Programs\Python38\lib\posixpath.py: 148: i = p.rfind(sep) + 1
C:\Programs\Python38\lib\posixpath.py: 158: i = p.rfind(sep) + 1
C:\Programs\Python38\lib\pyclbr.py: 145: i = module.rfind('.')
C:\Programs\Python38\lib\pydoc.py: 1657: desc += ' in ' +
name[:name.rfind('.')]
C:\Programs\Python38\lib\pydoc_data\topics.py: 10115:
'str.rfind(sub[, start[, end]])\n'
C:\Programs\Python38\lib\pydoc_data\topics.py: 10127:
' Like "rfind()" but raises "ValueError" when the '
C:\Programs\Python38\lib\site-packages\pip\_vendor\html5lib\_inputstream.py:
228: lastLinePos = chunk.rfind('\n', 0, offset)
C:\Programs\Python38\lib\site-packages\pip\_vendor\pyparsing.py: 1110:
return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc -
s.rfind("\n", 0, loc)
C:\Programs\Python38\lib\site-packages\pip\_vendor\pyparsing.py: 1127:
lastCR = strg.rfind("\n", 0, loc)
C:\Programs\Python38\lib\site-packages\pip\_vendor\pytoml\parser.py:
169: suffix_pos = s.rfind('\n')
C:\Programs\Python38\lib\site-packages\pkg_resources\_vendor\pyparsing.py:
979: return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc -
s.rfind("\n", 0, loc)
C:\Programs\Python38\lib\site-packages\pkg_resources\_vendor\pyparsing.py:
996: lastCR = strg.rfind("\n", 0, loc)
C:\Programs\Python38\lib\site-packages\setuptools\_vendor\pyparsing.py:
979: return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc -
s.rfind("\n", 0, loc)
C:\Programs\Python38\lib\site-packages\setuptools\_vendor\pyparsing.py:
996: lastCR = strg.rfind("\n", 0, loc)
C:\Programs\Python38\lib\site-packages\setuptools\msvc.py: 627:
intver = ver[:ver.rfind('.')]
C:\Programs\Python38\lib\smtpd.py: 941: lastdot =
classname.rfind(".")
C:\Programs\Python38\lib\smtplib.py: 326: if not port and
(host.find(':') == host.rfind(':')):
C:\Programs\Python38\lib\smtplib.py: 327: i = host.rfind(':')
C:\Programs\Python38\lib\sre_constants.py: 48: self.colno =
pos - pattern.rfind(newline, 0, pos)
C:\Programs\Python38\lib\test\test_bigmem.py: 294:
self.assertEqual(s.rfind(_(' ')), sublen + size + SUBSTR.rfind(_(' ')))
C:\Programs\Python38\lib\test\test_bigmem.py: 295:
self.assertEqual(s.rfind(SUBSTR), sublen + size)
C:\Programs\Python38\lib\test\test_bigmem.py: 296:
self.assertEqual(s.rfind(_(' '), 0, size), SUBSTR.rfind(_(' ')))
C:\Programs\Python38\lib\test\test_bigmem.py: 297:
self.assertEqual(s.rfind(SUBSTR, 0, sublen + size), 0)
C:\Programs\Python38\lib\test\test_bigmem.py: 298:
self.assertEqual(s.rfind(_('i')), sublen + size + SUBSTR.rfind(_('i')))
C:\Programs\Python38\lib\test\test_bigmem.py: 299:
self.assertEqual(s.rfind(_('i'), 0, sublen), SUBSTR.rfind(_('i')))
C:\Programs\Python38\lib\test\test_bigmem.py: 300:
self.assertEqual(s.rfind(_('i'), 0, sublen + size),
C:\Programs\Python38\lib\test\test_bigmem.py: 301:
SUBSTR.rfind(_('i')))
C:\Programs\Python38\lib\test\test_bigmem.py: 302:
self.assertEqual(s.rfind(_('j')), -1)
C:\Programs\Python38\lib\test\test_bytes.py: 527:
self.assertEqual(b.rfind(b'ss'), 5)
C:\Programs\Python38\lib\test\test_bytes.py: 528:
self.assertEqual(b.rfind(b'w'), -1)
C:\Programs\Python38\lib\test\test_bytes.py: 529:
self.assertEqual(b.rfind(b'mississippian'), -1)
C:\Programs\Python38\lib\test\test_bytes.py: 531:
self.assertEqual(b.rfind(i), 10)
C:\Programs\Python38\lib\test\test_bytes.py: 532:
self.assertEqual(b.rfind(w), -1)
C:\Programs\Python38\lib\test\test_bytes.py: 534:
self.assertEqual(b.rfind(b'ss', 3), 5)
C:\Programs\Python38\lib\test\test_bytes.py: 535:
self.assertEqual(b.rfind(b'ss', 0, 6), 2)
C:\Programs\Python38\lib\test\test_bytes.py: 537:
self.assertEqual(b.rfind(i, 1, 3), 1)
C:\Programs\Python38\lib\test\test_bytes.py: 538:
self.assertEqual(b.rfind(i, 3, 9), 7)
C:\Programs\Python38\lib\test\test_bytes.py: 539:
self.assertEqual(b.rfind(w, 1, 3), -1)
C:\Programs\Python38\lib\test\test_bytes.py: 758:
self.assertEqual(3, b.rfind(l, None))
C:\Programs\Python38\lib\test\test_bytes.py: 759:
self.assertEqual(3, b.rfind(l, -2, None))
C:\Programs\Python38\lib\test\test_bytes.py: 760:
self.assertEqual(2, b.rfind(l, None, -2))
C:\Programs\Python38\lib\test\test_bytes.py: 761:
self.assertEqual(0, b.rfind(h, None, None))
C:\Programs\Python38\lib\test\test_bytes.py: 791: for method in
(b.count, b.find, b.index, b.rfind, b.rindex):
C:\Programs\Python38\lib\test\test_bytes.py: 802:
self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
C:\Programs\Python38\lib\test\test_mmap.py: 296:
self.assertEqual(m.rfind(b'one'), 8)
C:\Programs\Python38\lib\test\test_mmap.py: 297:
self.assertEqual(m.rfind(b'one '), 0)
C:\Programs\Python38\lib\test\test_mmap.py: 298:
self.assertEqual(m.rfind(b'one', 0, -1), 8)
C:\Programs\Python38\lib\test\test_mmap.py: 299:
self.assertEqual(m.rfind(b'one', 0, -2), 0)
C:\Programs\Python38\lib\test\test_mmap.py: 300:
self.assertEqual(m.rfind(b'one', 1, -1), 8)
C:\Programs\Python38\lib\test\test_mmap.py: 301:
self.assertEqual(m.rfind(b'one', 1, -2), -1)
C:\Programs\Python38\lib\test\test_mmap.py: 302:
self.assertEqual(m.rfind(bytearray(b'one')), 8)
C:\Programs\Python38\lib\test\test_socket.py: 313: i =
methodname.rfind('.')
C:\Programs\Python38\lib\test\test_urllib2.py: 398: code =
action[action.rfind(" ")+1:]
C:\Programs\Python38\lib\urllib\parse.py: 384: i = url.find(';',
url.rfind('/'))
C:\Programs\Python38\lib\urllib\request.py: 2083: semi =
type.rfind(';')
C:\Programs\Python38\lib\warnings.py: 260: i = category.rfind(".")
C:\Programs\Python38\lib\zipfile.py: 292: start =
data.rfind(stringEndArchive)
C:\Programs\Python38\lib\zipimport.py: 384: pos =
data.rfind(STRING_END_ARCHIVE)
Hits found: 136
(Hint: right-click to open locations.)
--
Terry Jan Reedy
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/