我可以在Python的空列表中使用insert()吗?

时间:2017-07-13 15:25:59

标签: python

我对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'],这显然是错误的。 任何帮助,将不胜感激。在我应用的逻辑中有什么问题吗?

7 个答案:

答案 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']