所有
我最近选择了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'作为索引将每个'数据'插入到列表中,这意味着当我打印出列表的内容时,它们将按排序顺序打印。
提前致谢!
答案 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]
希望你能从这个例子中看到两件事:
list.insert(idx, val)
将内容插入当前具有索引idx
的位置,然后在该位置之后将所有内容颠覆。如果idx
大于列表的当前长度,则会在最后位置静默添加新项目。有多种方法可以实现您想要的功能:
如果您可以预测行数,可以预先分配列表,只需分配给列表中的元素而不是插入:
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
条目。
使用字典:
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])
根据需要将元素添加到列表中,这可能需要更多参与:
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']