Python 从字符串列表中提取特定元素并创建新列表?

Python 从字符串列表中提取特定元素并创建新列表?,python,list,Python,List,我是python的初学者 这是我的问题。我有一个清单如下 lst = ['UGAGGUAGUAGGUUGUAUAGUU', 'CUAUGCAAUUUUCUACCUUACC', 'UCCCUGAGACCUCAAGUGUGA', 'ACACCUGGGCUCUCCGGGUACC', 'CAUACUUCCUUACAUGCCCAUA', 'UGGAAUGUAAAGAAGUAUGUA', 'CAUCAAAGCGGUGGUUGAUGUG', 'UAUCACAGCCAGCUUUGAU

我是python的初学者

这是我的问题。我有一个清单如下

lst = ['UGAGGUAGUAGGUUGUAUAGUU', 'CUAUGCAAUUUUCUACCUUACC', 'UCCCUGAGACCUCAAGUGUGA',
       'ACACCUGGGCUCUCCGGGUACC', 'CAUACUUCCUUACAUGCCCAUA', 'UGGAAUGUAAAGAAGUAUGUA',
       'CAUCAAAGCGGUGGUUGAUGUG', 'UAUCACAGCCAGCUUUGAUGUGC', 'AGGCAGUGUGGUUAGCUGGUUG',
       'ACGGCUACCUUCACUGCCACCC']
现在我需要从
lst
中的所有10个元素中提取第一个字母,然后将它们放入一个新列表中。类似地,第二个字母、第三个字母等等,直到从所有十个元素中提取最后一个字母,并将其附加到新列表中。输出必须如下所示

new_lst = ['UCUACUCUAA', 'GUCCAGAAGC', 'AACAUGUUGG', 'GUCCAACCCG', 'GGUCCAAAAC',
           'UCGUUUACGU', 'AAAGUGAAUA', 'GAGGCUGGGC', 'UUAGCACCUC', 'AUCCUAGCGU', ..., 'C']
我尝试了以下代码:

new_lst = []
new_lst.append(''.join([x[i] for x in lst]))
上面的代码只打印新_列表中的前10个元素,因为索引是从0到9(我误解了索引的含义)

然后我做了下面的事情

final= []
for j in range(1,len(lst),1):
 new_lst = []
 for x in lst:
   c = len(x)
    for i in range(1,c,1):
       while (i<len(x)):
          new_lst.append(x[i])
       else:
          new_lst.append("")
 final.append([new_lst])
print final
我得到了以下输出:

22
0u1g2a3g4g5u6a7g8u9a10g11g12u13u14g15u16a17u18a19g20u21u22
0c1u2a3u4g5c6a7a8u9u10u11u12c13u14a15c16c17u18u19a20c21c21
0 U 1 C 2 C 3 C 4 U 5 G 6 A 7 G 8 A 9 C 10 C 11 U 12 C 13 A 14 A 15 G 16 U 17 G 18 U 19 G 20 A 22
0a1c2a3c4c5u6g7g8g9c10u11c12u13c14c15g16g17g18u19a20c21c22
0c1a2u3a4c5u6u7c8c9u10u11a12c13a14u15g16c17c18c19a20u21a21
0u1g2g3a4a5u6g7u8a9a10a11g12a13a14g15u16a17u18g19u20a22
0c1a2u3c4a5a6a7g8c9g10g11u12g13g14u15u16g17a18u19g20u21g23
0u1a2u3c4a5c6a7g8c9c10a11g12c13u14u15u16g17a18u19g20u21g22c22
0a1g2g3c4a5g6u7g8u9g10g11u12u13a14g15c16u17g18g19u20u21g22
0a1c2g3g4c5u6a7c8c9u10u11c12a13c14u15g16c17c18a19c20c21c
如上图所示,循环经过第一个元素,但在从
lst
中的第一个元素提取第一个字符后,它转到第一个元素中的第二个字符。但是我希望循环通过列表中的第二个元素
lst
。此外,列表中还有长度不等的元素,因此想知道是否有办法避免
索引器:字符串索引超出范围


我想我错过了什么,这可能太傻了。对不起,我太天真了。如果你能提出不同的方法来完成这项工作,那就太棒了。我在线查看了使用模块numpy中的数组,但是没有numpy有什么方法可以做到这一点吗?

您需要遍历最长字符串的索引:

lst = ['UGAGGUAGUAGGUUGUAUAGUU', 'CUAUGCAAUUUUCUACCUUACC',
       'UCCCUGAGACCUCAAGUGUGA', 'ACACCUGGGCUCUCCGGGUACC',
       'CAUACUUCCUUACAUGCCCAUA', 'UGGAAUGUAAAGAAGUAUGUA', 
       'CAUCAAAGCGGUGGUUGAUGUG', 'UAUCACAGCCAGCUUUGAUGUGC',
       'AGGCAGUGUGGUUAGCUGGUUG', 'ACGGCUACCUUCACUGCCACCC']

max_len = max(len(x) for x in lst) # length of the longest string
new_lst = [ ''.join(x[i] for x in lst if i < len(x)) for i in range(max_len)]
lst=['ugagguagguguguguaguu'、'cuaugcaauuucuacuacc',
“UCCCUGAGACCACAGUGUGGA”、“ACACCUGGGCUCCGGGUACC”,
“Cauacucuuacaugccua”、“Uggaaugaaugua”,
“Caucaaagcggugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugucaaagcagcagcuugugugugugugugugugugugug,
“aggcagugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugugug
max_len=max(len(x)表示lst中的x)#最长字符串的长度
new_lst=[''。如果i
您可以使用
itertools.zip\u

import itertools
[''.join(chars) for chars in itertools.zip_longest(*lst,fillvalue = '')]
输出:

['UCUACUCUAA', 'GUCCAGAAGC', 'AACAUGUUGG', 'GUCCAACCCG', 'GGUCCAAAAC', 'UCGUUUACGU', 'AAAGUGAAUA', 'GAGGCUGGGC', 'UUAGCACCUC', 'AUCCUAGCGU', 'GUCUUAGAGU', 'GUUCAGUGUC', 'UCCUCAGCUA', 'UUACAAGUAC', 'GAACUGUUGU', 'UCGGGUUUCG', 'ACUGCAGGUC', 'UUGGCUAAGC', 'AUUUCGUUGA', 'GAGAAUGGUC', 'UCACUAUUUC', 'UCCAGGGC', 'C']
Python 3中内置的
zip()
itertools
方法
zip_longest()
(或者,在Python 2中,
itertools
方法
izip()
izip_longest()
)是处理两个或多个iterables(例如列表、字符串或生成器)时的首选工具同时。要查看<代码> ZIP()> <代码> >代码> > ZIPLangEnter()>代码>:请考虑以下内容:

for chars in zip('ABCD','EFG','HI'):
    print(chars)
print('')
for chars in itertools.zip_longest('ABCD','EFG','HI',fillvalue = ''):
    print(chars)
输出:

('A', 'E', 'H')
('B', 'F', 'I')

('A', 'E', 'H')
('B', 'F', 'I')
('C', 'G', '')
('D', '', '')
生成的第一个元组是第一个元素的元组,生成的第二个元组是第二个元素的元组,以此类推。
zip
(或
izip
)在第一个iterable用完后立即停止。在这种情况下,它不能返回每个字符串中第三个字符的元组,因为
zip
的第三个输入缺少第三个字符
zip_longest()
(或
izip_longest()
)允许一个fillvalue在较短的iterable中替换缺失的项,一旦它们被删除。这里我使用了空字符串,因为当元组被
'
连接时,空字符串就消失了

在上面的代码中,我将3个字符串硬连接到
zip\u longest()
。对于您的问题,您必须显式地输入10个输入,这在极端情况下会很繁琐,或者使用解包操作符
*
。如果我有一份清单:

strings = ['ABCD','EFG', 'HI']
然后

相当于


该死。打败我@juanpa.arrivillaga有时Python非常容易,几乎看起来像是作弊。当我需要使用其他语言时,这是一个问题,我的大脑立即会想到“好吧,在Python中,我可以只使用
itertools
和…”非常感谢。约翰,你能解释一下你命令中的每一部分是做什么的吗。我知道外方括号表示它是一个列表“”。join(chars)表示我们通过“”将chars中的所有元素连接起来。但我不太清楚“for chars in itertools.zip_longest(*lst,fillvalue='')的作用是什么。我问这个只是为了我自己的学习经验。同样在itertools.zip中也不适合我。它显示了一个错误,但是itertools.izip在Python 2中工作
itertools.zip_longest()
itertools.izip_longest()
。您确实想要
最长的
部分。谢谢您Yevhen:)
strings = ['ABCD','EFG', 'HI']
for char in itertools.zip_longest(*strings, fillvalue = ''):
for chars in itertools.zip_longest('ABCD','EFG','HI',fillvalue = ''):