我有以下列表,包含2个元素:
['AGCTT 6 6 35 25 10', 'AGGGT 7 7 28 29 2']
我需要制作一个列表或zip文件,使每个字母对应于列表中的其数字。例如,在列表[0]中,列表/ zip应该是
{"A":"6", "G":"6", "C":"35","T":"25","T":"10"}
我可以列出存储列表[0],列表[1],...列表[n]的相应值的列表/拉链吗?
注意:字母只能是A,G,C或T,数字可以取任何值
编辑1:以前,我以为我可以使用字典。但有几位成员指出,这是不可能做到的。所以我只想制作一个列表或zip或其他任何建议将Alphabet元素与其对应的数字配对的东西。
答案 0 :(得分:2)
使用元组拆分一次得到对,然后将每一对的第二个元素 zip 分开:
l =['AGCTT 6 6 35 25 10', 'AGGGT 7 7 28 29 2']
pairs = [zip(a,b.split()) for a,b in (sub.split(None,1) for sub in l]
哪会给你:
[[('A', '6'), ('G', '6'), ('C', '35'), ('T', '25'), ('T', '10')], [('A', '7'), ('G', '7'), ('G', '28'), ('G', '29'), ('T', '2')]]
使用带有 list.append的for循环:
l = ['AGCTT 6 6 35 25 10', 'AGGGT 7 7 28 29 2']
out = []
for a,b in (sub.split(None,1) for sub in l ):
out.append(zip(a,b))
如果您想将任何字母转换为Z
,其中数字为< 10,你只需要另一个循环来检查每个配对中的数字:
pairs = [[("Z", i ) if int(i) < 10 else (c, i) for c,i in zip(a, b.split())]
for a,b in (sub.split(None, 1) for sub in l)]
print(pairs)
哪会给你:
[[('Z', '6'), ('Z', '6'), ('C', '35'), ('T', '25'), ('T', '10')], [('Z', '7'), ('Z', '7'), ('G', '28'), ('G', '29'), ('Z', '2')]]
将其分解为常规循环:
pairs = []
for a, b in (sub.split(None, 1) for sub in l):
pairs.append([("Z", i) if int(i) < 10 else (c, i) for c, i in zip(a, b.split())])
print(pairs)
如果相应的数字[("Z", i) if int(i) < 10 else (c, i) for c, i in zip(a, b.split())]
为Z
, i
会将字母设置为< 10
,否则我们会将该字母保留原样。
如果您只需要使用 zip transpose来恢复原始配对:
In [13]: l = ['AGCTT 6 6 35 25 10', 'AGGGT 7 7 28 29 2']
In [14]: pairs = [[("Z", i) if int(i) < 10 else (c, i) for c, i in zip(a, b.split())] for a, b in
....: (sub.split(None, 1) for sub in l)]
In [15]: pairs
Out[15]:
[[('Z', '6'), ('Z', '6'), ('C', '35'), ('T', '25'), ('T', '10')],
[('Z', '7'), ('Z', '7'), ('G', '28'), ('G', '29'), ('Z', '2')]]
In [16]: unzipped = [["".join(a), " ".join(b)] for a, b in (zip(*tup) for tup in pairs)]
In [17]: unzipped
Out[17]: [['ZZCTT', '6 6 35 25 10'], ['ZZGGZ', '7 7 28 29 2']]
zip(*...)
会将原始元素返回到自己的元组中,然后我们只需要将字符串重新连接在一起。如果你想回到原始状态,你可以再次加入:
In[18][ " ".join(["".join(a), " ".join(b)]) for a, b in (zip(*tup) for tup in pairs) ]
Out[19]: ['ZZCTT 6 6 35 25 10', 'ZZGGZ 7 7 28 29 2']
答案 1 :(得分:1)
如果您考虑使用元组配对项目,那么这可行:
>>> from pprint import pprint
>>> lst = ['AGCTT 6 6 35 25 10', 'AGGGT 7 7 28 29 2']
>>> new_lst = [list(zip(sub[0], sub[1:])) for sub in [i.split() for i in lst]]
>>> pprint(new_lst)
[[('A', '6'), ('G', '6'), ('C', '35'), ('T', '25'), ('T', '10')],
[('A', '7'), ('G', '7'), ('G', '28'), ('G', '29'), ('T', '2')]]
[i.split() for i in lst]
:字符串的初始拆分。
zip(sub[0], sub[1:]))
:字母列表和数字列表
答案 2 :(得分:0)
遍历列表&gt;迭代列表的项目(字母数字)并构造字符和数字列表&gt;然后构建元组列表。
alphanum = ['AGCTT 6 6 35 25 10', 'AGGGT 7 7 28 29 2']
list_of_tuple = []
for s in alphanum:
ints = []
chars = []
for i in s.split():
if i.isdigit():
ints.append(i)
else:
chars.append(i)
new_tuple = []
for (n, item) in enumerate(list(chars[0])):
new_tuple.append((item, ints[n]))
list_of_tuple.append(new_tuple)
print list_of_tuple
答案 3 :(得分:-1)
假设列表中的元素正确形成,此代码将起作用。 这意味着字母和数字必须匹配!
如果密钥已经存在,它将覆盖该值。
list = ['AGCTT 6 6 35 25 10', 'AGGGT 7 7 28 29 2']
dictionary = {}
for line in list:
split_line = line.split()
letters = split_line[0]
iterator = 1
for letter in letters:
dictionary[letter] = split_line[iterator]
iterator += 1
print dictionary
此修改后的密钥将检查密钥是否存在,并将其添加到具有该密钥的列表中:
list = ['AGCTT 6 6 35 25 10', 'AGGGT 7 7 28 29 2']
dictionary = {}
for line in list:
split_line = line.split()
letters = split_line[0]
iterator = 1
for letter in letters:
if letter in dictionary.keys():
dictionary[letter].append(split_line[iterator])
else:
dictionary[letter] = [split_line[iterator]]
iterator += 1
print dictionary