所以假设我在列表A中得到了200个数值的列表。我想制作一个列表B,将4个簇中的列表A拆分,这样我就得到50个簇。在列表B中,我想为每个4个值的簇创建一个列表,因此它将在列表B中包含50个列表。
我会用我的来源解释我的问题:
from pprint import pprint
FileValuelist = []
def DetermineClusterNumber(File): #determine digits in a cluster
Lines = open(File, "r")
i = 0 # used for iterating through the lines
FirstLine = Lines.readline()
for char in FirstLine: # read through first line, till hyphen.
if char != "-":
i += 1
elif char == "-":
return i # Return number of digits in the cluster
def ReadLines(File, Cluster_Number):
Lines = open( File, "r" )
for Line in Lines:
for char in Line:
if char != "-":
FileValuelist.append(char)
def RemoveNewlines(Rawlist):
for x in range(len(FileValuelist)-9):
if FileValuelist[x] == "\n":
FileValuelist.remove(FileValuelist[x])
if FileValuelist[x] == "\r":
FileValuelist.remove(FileValuelist[x])
Cluster_Number = DetermineClusterNumber("Serials.txt") # Amount of chars in a cluster. Example: 1234-2344-2345. clusternumber = 4
ReadLines ("Serials.txt", Cluster_Number)
RemoveNewlines(FileValuelist)
list_iterater = 0
FinishedList = ([[None]*(Cluster_Number)])*((len(FileValuelist)))
amount_of_clusters = len(FileValuelist)/Cluster_Number
for x in range(0, amount_of_clusters):
for y in range(0, Cluster_Number):
FinishedList[x][y] = FileValuelist[list_iterater]
list_iterater += 1
pprint(FinishedList)
使用serialals.txt包含:
4758-8345-1970-4486-2348
2346-1233-3463-7856-4572
6546-6874-1389-9842-4185
9896-4688-4689-6455-4712
9541-5621-8414-7465-5741
4545-9959-5632-6845-1351
5643-2435-5854-6754-8749
7892-3457-8923-4572-5397
5623-5698-5468-5476-9874
8762-3487-6123-7861-2679
当我运行它时,我希望它在列表中打印serials.txt,其中包含50个拆分50列表。然而,当我运行它时,它打印出[2,6,7,8]五十次。那是最后一个集群。所以我猜这个问题就在第39行。 我已经尝试查看在第41行为FinishedList分配了什么值,并且每次都是正确的值(因此不是2,6,7,9,就像列表打印出来时一样)。我已经重新检查了x和y迭代器(是的,我知道它是拼写的迭代器),它们也是正确的。
那么我的代码有什么问题让它打印最后一个集群五十次呢? 如果你不知道的话,我正在使用Python 2.7。
提前致谢!
答案 0 :(得分:1)
这条线没有按照你的想法行事:
FinishedList = ([[None]*(Cluster_Number)])*((len(FileValuelist)))
它将引用存储到相同的[None, None, None... None]
列表,len(FileValuelist)
次(*
运算符基本上执行浅层复制)。如果您想确保创建新列表,最简单的方法是使用list comprehension。
FinishedList = [[None] * Cluster_Number for _ in xrange(len(FileValuelist))]
答案 1 :(得分:0)
第FinishedList = ([[None]*(Cluster_Number)])*((len(FileValuelist)))
行上的第二次乘法实际上并不创建len(FileValuelist)
个新列表,只是指向原始列表的许多指针。当你改变其中任何一个都改变。我问过the same question一会儿,看那里接受的答案。
答案 2 :(得分:0)
初始化FinishedList
的方式,最终得到一个列表,其中包含对同一子列表的引用。然后,当您转到并分配给[x][y]
时,您将覆盖每次重复引用的相同值。您不需要在Python中初始化列表,因此请尝试在第二个循环中使用append()
。
for x in range(amount_of_clusters):
offset = x * Cluster_Number
FinishedList.append(FileValueList[offset:offset + Cluster_Number])
答案 3 :(得分:0)
为什么你这么复杂呢?您可以使用两行代码完成您想要的任务:
>>> with open('serials.txt') as data:
... clusters = [[int(digit) for digit in cluster] for line in data for cluster in line.strip().split('-')]
然后clusters
包含:
[
[4, 7, 5, 8],
[8, 3, 4, 5],
[1, 9, 7, 0],
# ...
]
答案 4 :(得分:0)
老兄,没有冒犯,但你的代码是非常单一的 - 寻找代码风格和列表的一些教程。整个问题(如果我理解正确的话)可以通过一些简单的代码来解决。
据我了解,您希望将文件中的每个四位数值转换为其数字列表,并将这些数字存储在另一个列表中,这意味着输入
"1234-5678-9999"
结果应该是
[[1,2,3,4], [5,6,7,8], [9,9,9,9]]
这可以很容易实现:
with open("serials.txt") as f:
clusters = [c for line in f for c in line.strip().split("-")]
digits = [list(c) for c in clusters]
数字现在包含每个群集的字符列表。如果您需要将值作为整数,则可以将list(c)
更改为嵌套列表理解,例如[int(x) for x in c]
。