迭代从索引开始的python字符串

时间:2015-10-12 10:49:29

标签: python string iterator character

如果我有一个非常长的字符串(例如1亿个字符),有没有办法使用像for c in str:这样的字符迭代字符,但是在其中开始一定数量的字符?我不想切割字符串并使用子集,因为我知道切割字符串会产生副本(在我的情况下非常昂贵)。换句话说,我可以在字符串上指定迭代器的起始点吗?

4 个答案:

答案 0 :(得分:8)

在python3 range中是一个生成器,而不是列表。这意味着以下代码不需要过多的内存:

for i in range(start_pos, len(my_string)):
   print(my_string[i])

如果您宁愿使用my_string上的迭代器,那么您需要自己编写:

def iter_starting_at(start_pos, string):
    for i in range(start_pos, len(string)):
        yield string[i]

for character in iter_starting_at(start_pos, my_string):
    print(character)

答案 1 :(得分:1)

你可以使用字符串索引来完成它,比如它的列表:

for i in xrange(100, 200):
    print(s[i])

答案 2 :(得分:1)

考虑使用itertools.islice,如下所示:

from itertools import islice

for c in islice(my_str, start, stop):
    print(c)

答案 3 :(得分:0)

我们可以使用public class MyActivity extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { myView=inflater.inflate(R.layout.activity_room_summary,null); setHasOptionsMenu(true); initializeValue(); return myView; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if(id == R.id.action_dash){ checkBox.setVisibility(View.VISIBLE);//Not working return true; } return super.onOptionsItemSelected(item); } } public void initializeValue(){ adapter = new MyAdapter(ctx, R.layout.activity_list, listMy); } public class MyAdapter extends ArrayAdapter<My> { @Override public View getView ( int position, View convertView, ViewGroup parent ) { checkBox.setVisibility(View.INVISIBLE); } } 而不是在字符串中生成索引,而是在片上返回迭代器。

itertools.islice