Python:使用length作为索引

时间:2017-10-12 10:50:18

标签: python list

所有

我最近选择了Python,目前正在处理列表。我正在使用一个测试文件,其中包含由选项卡缩进的几行字符,然后将其传递给我的python程序。 我的python脚本的目的是使用length作为索引将每行插入到列表中,这意味着列表将自动排序。我正在考虑最基本的案例,并不关心任何复杂的案件。

我的python代码如下;

newList = []

for line in sys.stdin:
    data = line.strip().split('\t')
    size = len(data)
    newList.insert(size, data)
for i in range(len(newList)):
    print ( newList[i])

我的'测试'文件如下;

2   2   2   2
1
3   2
2   3   3   3   3
3   3   3

我对python脚本输出的期望是按照以下顺序打印列表内容;按长度排序;

['1']
['3', '2']
['3', '3', '3']
['2', '2', '2', '2']
['2', '3', '3', '3', '3']

但是,当我将测试文件传递给我的python脚本时,我得到以下内容;

cat test | ./listSort.py 
['2', '2', '2', '2']
['1']
['3', '2']
['3', '3', '3']
['2', '3', '3', '3', '3']

输出的第一行['2','2','2','2']不正确。我试图找出为什么它没有在第4行打印(因为长度为4意味着它将被插入到列表的第4个索引中)。有人可以提供一些有关为什么这样做的见解?我的理解是我使用'size'作为索引将每个'数据'插入到列表中,这意味着当我打印出列表的内容时,它们将按排序顺序打印。

提前致谢!

2 个答案:

答案 0 :(得分:3)

插入列表的工作方式与您的想法完全不同:

>>> newList = []
>>> newList.insert(4, 4)
>>> newList
[4]
>>> newList.insert(1, 1)
>>> newList
[4, 1]
>>> newList.insert(2, 2)
>>> newList
[4, 1, 2]
>>> newList.insert(5, 5)
>>> newList
[4, 1, 2, 5]
>>> newList.insert(3, 3)
>>> newList
[4, 1, 2, 3, 5]
>>> newList.insert(0, 0)
>>> newList
[0, 4, 1, 2, 3, 5]

希望你能从这个例子中看到两件事:

  • 列表索引从0开始。也就是说,第一个条目的索引为0,第二个条目的索引为1,等等。
  • list.insert(idx, val)将内容插入当前具有索引idx的位置,然后在该位置之后将所有内容颠覆。如果idx大于列表的当前长度,则会在最后位置静默添加新项目。

有多种方法可以实现您想要的功能:

  1. 如果您可以预测行数,可以预先分配列表,只需分配给列表中的元素而不是插入:

    newList = [None] * 5
    
    for line in sys.stdin:
        data = line.strip().split('\t')
        size = len(data)
        newList[size - 1] = data
    for i in range(len(newList)):
        print ( newList[i])
    

    如果您可以预测行数的合理上限,您也可以这样做,但您需要有一些方法可以在之后删除None条目。

  2. 使用字典:

    newList = {}
    
    for line in sys.stdin:
        data = line.strip().split('\t')
        size = len(data)
        newList[size - 1] = data
    for i in range(len(newList)):
        print ( newList[i])
    
  3. 根据需要将元素添加到列表中,这可能需要更多参与:

    newList = []
    
    for line in sys.stdin:
        data = line.strip().split('\t')
        size = len(data)
        if len(newList) < size: newList.extend([None] * (size - len(newList)))
        newList[size - 1] = data
    for i in range(len(newList)):
        print ( newList[i])
    

答案 1 :(得分:1)

我相信我已经找到了问题的答案,感谢mkrieger1。我附加到列表,然后使用长度作为键对其进行排序;

newList = []

for line in sys.stdin:
    data = line.strip().split('\t')
    newList.append(data)
newList.sort(key=len)
for i in range(len(newList)):
    print (newList[i])

我得到了我想要的输出;

/listSort.py < test
['1']
['3', '2']
['3', '3', '3']
['2', '2', '2', '2']
['2', '3', '3', '3', '3']