我有一個很長的字符串s1
,以及這個字符串中的字符位置列表lst = [...]
。我想構造一個字符串s2
,其中只包含s1
的字符lst
給出的位置。我怎樣纔能有效地做到這一點?如何通過有效連接字符來構造字符串?
2
A
回答
11
newstring = "".join(s1[i] for i in lst)
如果你不絕對知道這s1
不會有太長的任何索引,這樣做:
newstring = "".join(s1[i:i+1] for i in lst)
它的速度較慢,但沒有索引錯誤。
編輯:。已經引起了我的注意,用列表的理解,而不是一臺發電機表達"".join(...)
更有效率,所以要做到這一點,只需添加括號:
newstring = "".join([s1[i] for i in lst])
7
另外,使用operator.itemgetter
:
>>> from operator import itemgetter
>>> s = ''
>>> lst = [0, 3, 6, 8]
>>> ''.join(itemgetter(*lst)(s))
'0368'
既然你問了效率,這應該是比加盟發生器快一點:
In [6]: timeit ''.join(s[i] for i in lst)
1000000 loops, best of 3: 1.18 µs per loop
In [7]: timeit ''.join(itemgetter(*lst)(s))
1000000 loops, best of 3: 430 ns per loop
編輯:我也認爲代碼不應該跳過列表,沒有道理。如果列表中存在無意義的索引,您希望代碼提起IndexError
,然後從那裏恢復。
相關問題
- 1. 如何附加(連接)字符串來構造一個新的字符串?
- 2. 構造DataContext類的連接字符串
- 3. 連接字符串無效
- 4. 構建通用連接字符串
- 5. 如何構造一個沒有重複字符的字符串?
- 6. 通過循環連接字符串
- 7. 的Sql通過和字符串連接
- 8. 通過SqlClient的Sql連接字符串
- 9. PHP - 字符串連接 - 通過循環
- 10. 通過netcat連接發送字符串
- 11. 如何通過多字符分隔符來分割字符串?
- 12. 字符串字符連接
- 13. 如何連接字符串?
- 14. 如何連接字符串
- 15. 通過套接字發送字符串並連接到該字符串
- 16. 在Python 2.7中構造沒有連接的字符串012
- 17. 從字符構造字符串流
- 18. 如何從常規字符串構造模板字符串?
- 19. SML:通過直接打印字符串替換連續字符
- 20. 如何配置帶有FailOver的ODP.NET連接字符串的連接字符串?
- 21. 通過接受字符串
- 22. 如何通過C++中的兩個字符串交替字符串連接字符串?
- 23. 如何構造一個長字符串
- 24. 按字符串連接字符串COBOL
- 25. 在Excel中通過連接字符串將字符串列轉換爲數字
- 26. 如何在BindingSource過濾器字符串中「僞造」通配符?
- 27. 如何創造來自字符串
- 28. 如何在給定所有參數的情況下構造連接字符串?
- 29. 如何字符串比較短的字符串字面有效
- 30. 正則表達式來連接字符串直到連字符
如果索引大於字符串的長度,將會引發索引錯誤。在join()中使用生成器表達式也不是非常有效。 – Kasramvd
'lst'是's1'中字符的位置,通過這個定義它不能超出它的範圍 –
@Kasramvd當然,它是由OP使用輸入數據,使其有意義/消毒它。 OP沒有提到他的名單可能沒有意義。這個解決方案很好,可以很容易地調整。 – timgeb