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