我对Python中的insert()
函数如何工作感到困惑。我试图反转一个字符串,我想我可以通过简单地创建一个列表,以相反的顺序存储原始字符串的字符。这是我的代码: -
def reverse(text):
rev = []
l = len(text) - 1
for c in text:
rev.insert(l, c)
l -= 1
return rev
print reverse("Hello")
然而我得到的输出是['o', 'H', 'l', 'e', 'l']
,这显然是错误的。
任何帮助,将不胜感激。在我应用的逻辑中有什么问题吗?
答案 0 :(得分:2)
是,您可以在python 的空列表中使用 public class HelpFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootview = inflater.inflate(R.layout.fragment_help,container,false);
ini();
pressing();
return rootview;
}
private void ini()
{
tabs = (TabLayout) rootview.findViewById(R.id.tabs);
setupTabLayout(tabs);
}
private void pressing()
{
tabs.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
TabViewHolder holder = (TabViewHolder) tab.getTag();
if (holder == null) {
Log.e("TAG", "ViewHolder for tab " + tab.getPosition() + " not set");
} else {
tab.setIcon(holder.selectedIconId);
Log.e("TAG",tab.getPosition() + " // onTabSelected ");
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
TabViewHolder holder = (TabViewHolder) tab.getTag();
if (holder == null) {
Log.e("TAG", "ViewHolder for tab " + tab.getPosition() + " not set");
} else {
tab.setIcon(holder.unselectedIconId);
Log.e("TAG",tab.getPosition() + " // onTabUnselected ");
}
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
Log.e("TAG",tab.getPosition() + " // onTabReselected ");
}
});
}
private void setupTabLayout(TabLayout tabLayout) {
TabViewHolder homeTabHolder = new TabViewHolder("Hour service" , R.drawable.hourservice_one_selected, R.drawable.hourservice_one_unselected);
TabViewHolder inboxTabHolder = new TabViewHolder("Hour service" ,R.drawable.hourservice_one_selected, R.drawable.hourservice_one_unselected);
TabViewHolder starTabHolder = new TabViewHolder("Hour service" ,R.drawable.hourservice_one_selected, R.drawable.hourservice_one_unselected);
TabViewHolder star2TabHolder = new TabViewHolder("Hour service" ,R.drawable.hourservice_one_selected, R.drawable.hourservice_one_unselected);
TabViewHolder star3TabHolder = new TabViewHolder("Hour service" ,R.drawable.hourservice_one_selected, R.drawable.hourservice_one_unselected);
TabViewHolder star4TabHolder = new TabViewHolder("Hour service" ,R.drawable.hourservice_one_selected, R.drawable.hourservice_one_unselected);
final TabLayout.Tab home = tabLayout.newTab()
.setText(homeTabHolder.text)
.setIcon(homeTabHolder.unselectedIconId) // set this as first selected
.setTag(homeTabHolder);
final TabLayout.Tab inbox = tabLayout.newTab()
.setText(inboxTabHolder.text)
.setIcon(inboxTabHolder.unselectedIconId)
.setTag(inboxTabHolder);
final TabLayout.Tab star = tabLayout.newTab()
.setText(starTabHolder.text)
.setIcon(starTabHolder.unselectedIconId)
.setTag(starTabHolder);
final TabLayout.Tab star2 = tabLayout.newTab()
.setText(star2TabHolder.text)
.setIcon(star2TabHolder.unselectedIconId)
.setTag(star2TabHolder);
final TabLayout.Tab star3 = tabLayout.newTab()
.setText(star3TabHolder.text)
.setIcon(star3TabHolder.unselectedIconId)
.setTag(star3TabHolder);
final TabLayout.Tab star4 = tabLayout.newTab()
.setText(star4TabHolder.text)
.setIcon(star4TabHolder.unselectedIconId)
.setTag(star4TabHolder);
tabLayout.addTab(home,0,false);
tabLayout.addTab(inbox,1,false);
tabLayout.addTab(star,2,false);
tabLayout.addTab(star2,3,false);
tabLayout.addTab(star3,4,false);
tabLayout.addTab(star4,5,false);
tabLayout.setSelected(false);
// tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(getContext(), R.color.white));
tabLayout.setTabTextColors(
ContextCompat.getColor(getContext(), R.color.tabunselected),
ContextCompat.getColor(getContext(), R.color.white)
);
}
private static class TabViewHolder {
int selectedIconId, unselectedIconId;
String text;
public TabViewHolder(String text,int selectedIconId, int unselectedIconId) {
this.text = text;
this.selectedIconId = selectedIconId;
this.unselectedIconId = unselectedIconId;
}
}
}
。这直接导致您的代码出现问题:
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabTextAppearance="@style/MyCustomTabText"
app:tabMode="scrollable"
app:tabContentStart="30dp"
app:tabIndicatorHeight="1dp"
app:tabPaddingEnd="5dp"
app:tabPaddingStart="5dp"
app:tabGravity="fill"
app:tabIndicatorColor="@color/white"
android:background="@color/tabbackground"
android:layout_above="@+id/avaiable"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
如果索引大于列表的长度,则只会追加该项目。在您的代码中,第一个插入位置是insert()
位置5;但这只会导致rev = []
rev.insert(3, 'a') # ['a']
。这是'H'
的错误立场!
补救措施只是插入第0位:
rev = ['H']
(以防万一:在python中最简单的方法是:'H'
。
答案 1 :(得分:1)
在python中,列表是零索引。因此,当您执行insert(1,c)
时,您实际上是插入列表中的SECOND位置。
要在列表的开头插入,请使用insert(0,c)
。
答案 2 :(得分:1)
您要找的是+--------+------+-------------------------+-------------------------+------------+------+
| Period | Week | StartDate | EndDate | DayOfWeek | Year |
+--------+------+-------------------------+-------------------------+------------+------+
| 1 | 1 | 2016-07-01 00:00:00.000 | 2016-07-02 00:00:00.000 | 2016-07-01 | 2016 |
| 1 | 1 | 2016-07-01 00:00:00.000 | 2016-07-02 00:00:00.000 | 2016-07-02 | 2016 |
| 1 | 2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-03 | 2016 |
| 1 | 2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-04 | 2016 |
| 1 | 2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-05 | 2016 |
| 1 | 2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-06 | 2016 |
| 1 | 2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-07 | 2016 |
| 1 | 2 | 2016-07-03 00:00:00.000 | 2016-07-09 00:00:00.000 | 2016-07-08 | 2017 |
.
.
.
| 12 | 5 | 2017-06-25 00:00:00.000 | 2017-07-01 00:00:00.000 | 2017-06-28 | 2017 |
| 12 | 5 | 2017-06-25 00:00:00.000 | 2017-07-01 00:00:00.000 | 2017-06-29 | 2017 |
| 12 | 5 | 2017-06-25 00:00:00.000 | 2017-07-01 00:00:00.000 | 2017-06-30 | 2017 |
+--------+------+-------------------------+-------------------------+------------+------+
:
deque
输出:
from collections import deque
s = "Hello"
d = deque() #create a deque object
for i in s:
d.appendleft(i)
print(''.join(d))
deque允许您选择在两端创建可变列表。方法olleH
与appendleft()
相同。
答案 3 :(得分:1)
您希望在开头插入:l.insert(0, ...)
。
In [85]: l = list('Hello')
In [86]: rev = []
...: for c in l:
...: rev.insert(0, c)
...:
In [87]: rev
Out[87]: ['o', 'l', 'l', 'e', 'H']
答案 4 :(得分:1)
虽然其他人已经向您展示了如何修复您的方法,但我会解释您之前的方法出了什么问题。
您的方法存在的问题是您的列表会更改每次迭代。因此,元素的插入位置相对于列表的当前长度。以下是循环基本完成的步骤:
>>> rev = []
>>> l = len('Hello') - 1
>>> l
4
>>> # first iteration
>>> rev.insert(l, 'H')
>>> rev
['H']
>>> l -= 1
>>> l
3
>>> # second iteration
>>> rev.insert(l, 'e')
>>> rev
['H', 'e']
>>> l -= 1
>>> l
2
>>> # third iteration
>>> rev.insert(l, 'l')
>>> rev
['H', 'e', 'l']
>>> l -= 1
>>> l
1
>>> # fourth iteration
>>> rev.insert(l, 'l')
>>> rev
['H', 'l', 'e', 'l']
>>> l -= 1
>>> l
0
>>> # Fifth iteration
>>> rev.insert(l, 'o')
>>> rev
['o', 'H', 'l', 'e', 'l']
>>> l -= 1
>>> l
-1
>>> # end
如您所见,您的插入位置会根据列表的增长方式进行更改。有时insert
的行为与append()
相似,有时候会回归insert()
。
您可以通过设置插入位置0
来解决此问题。这样,无论列表如何更改,您始终会附加到列表的开头:
rev.insert(0, c)
答案 5 :(得分:0)
您可以尝试这种方式:
def reverse(text):
rev = []
for c in text:
rev.insert(0, c)
return rev
print reverse("Hello")
答案 6 :(得分:-1)
def reverse(text):
revText = text[::-1]
return list(revText)
print reverse("Hello")
结果
['o', 'l', 'l', 'e', 'H']