在Python2.7中更改列表并创建新列表
我有一个类似以下小示例的列表:在Python2.7中更改列表并创建新列表,python,list,Python,List,我有一个类似以下小示例的列表: mylist = [['chr1', '+', '11873', '14409', 'DDX11L1'], ['chr1', '-', '14361', '16765', 'WASH7P']] 我正在尝试创建一个新的列表列表,其中不是每个子列表,而是3个子列表。事实上,列表的新列表(称为newmylist)将有6个子列表。 事实上,在newmylist中,除第3列和第4列外,每3个新的子列表都是类似的。第3列是开始,第4列是结束。要计算newmylist中的第3
mylist = [['chr1', '+', '11873', '14409', 'DDX11L1'], ['chr1', '-', '14361', '16765', 'WASH7P']]
我正在尝试创建一个新的列表列表,其中不是每个子列表,而是3个子列表。事实上,列表的新列表(称为newmylist)将有6个子列表。
事实上,在newmylist中,除第3列和第4列外,每3个新的子列表都是类似的。第3列是开始,第4列是结束。要计算newmylist中的第3列和第4列,我将(第4列和第3列之间的差异)除以3
。
例如,关于mylist
中的第一个子列表:
(14409 - 11873)/3 = 845
因此,在newmylisy的第一个子列表中,开始是11873,结束是12718,在第二个子列表中,开始是12718,结束是13563。在第三个子列表中,起始值为13563,结束值为14409。newmylist中的第二个3个子列表将由mylist中的第二个子列表生成。这是预期的输出
预期输出
:
newmylist = [['chr1', '+', '11873', '12718', 'DDX11L1'], ['chr1', '+', '12718', '13563', 'DDX11L1'], ['chr1', '+', '13563', '14409', 'DDX11L1'], ['chr1', '-', '14361', '15162', 'WASH7P'], ['chr1', '-', '15162', '15963', 'WASH7P'], ['chr1', '-', '15963', '16765', 'WASH7P']]
我正试图在python
中使用以下代码来实现这一点。此代码不返回我正在查找的内容。你知道怎么修吗
start = []
for item in mylist:
start.append(item[2])
end = []
for item in mylist:
end.append(item[3])
diff = []
for item in mylist:
d = item[3]-item[2]/3
diff.append(d)
newmylist = []
for i in range(len(mylist)):
content = [i[0], i[1], start[i], start[i]+diff[i], i[4]]
newmylist.append(content)
您并不是真的将列表拆分为3个单独的列表(在上一个循环中)。实现这一点的一种方法是定义一个名为split
的函数,该函数可以按需要拆分列表。然后,您可以方便地在每个子列表上调用该函数:
def split(l, chunks=3):
diff = (int(l[3]) - int(l[2])) // chunks
res = []
for i in range(chunks):
res.append([l[0], l[1], str(int(l[2]) + diff * i), str(int(l[2]) + diff * (i + 1)), l[4]])
res[-1][3] = l[3] # adjust last number to match what "l" has
return res
mylist = [['chr1', '+', '11873', '14409', 'DDX11L1'], ['chr1', '-', '14361', '16765', 'WASH7P']]
newmylist = []
for lst in mylist:
for newlst in split(lst):
newmylist.append(newlst)
print(newmylist)
输出
[['chr1', '+', '11873', '12718', 'DDX11L1'],
['chr1', '+', '12718', '13563', 'DDX11L1'],
['chr1', '+', '13563', '14409', 'DDX11L1'],
['chr1', '-', '14361', '15162', 'WASH7P'],
['chr1', '-', '15162', '15963', 'WASH7P'],
['chr1', '-', '15963', '16765', 'WASH7P']]
请注意,如果您愿意,也可以使用列表理解:
newmylst = [newlst for lst in mylist for newlst in split(lst)]
请修改你的帖子,这样它就不那么难读了。删除整个程序中只应为文本的代码块。@kstullich我这样做了。如何使拆分函数更通用。例如,如果我想使用1000而不是3,我不能像split那样手动执行。如何使其更通用?@elly您可以使用for
循环,并根据区块大小进行正确的计算(请参阅更新的答案)。