![](/img/trans.png)
[英]Naturally sort a list of alpha-numeric tuples by the tuple's first element in Python
[英]How to create tuples from a single list with alpha-numeric chacters?
我有以下包含2個元素的列表:
['AGCTT 6 6 35 25 10', 'AGGGT 7 7 28 29 2']
我需要制作一個列表或zip文件,以使每個字母都對應於列表中更進一步的數字。 例如,在list [0]中,列表/郵政編碼應顯示為
{"A":"6", "G":"6", "C":"35","T":"25","T":"10"}
我可以列出包含list [0],list [1],... list [n]的相應價位的此類list / zip的清單嗎?
注意:字母只能是A,G,C或T,數字可以是任何值
編輯1:以前,我認為我可以使用字典。 但是,一些成員指出,這是不可能做到的。 因此,我只想列出一個列表或一個zip或任何其他建議將Alphabet元素與其對應的數字配對。
使用一次元組拆分來獲取對,然后拆分每對的第二個元素,將它們壓縮在一起:
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))
如果要將任何字母轉換為數字<10的字母Z
,則只需要另一個循環即可檢查每個配對中的數字:
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())]
如果對應的數字i
< 10
[("Z", i) if int(i) < 10 else (c, i) for c, i in zip(a, b.split())]
字母設置為Z
否則,我們就按原樣保留這封信。
如果您只需要用zip 轉置后想回到原始對:
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']
如果您考慮使用元組對項進行配對,則可以這樣做:
>>> 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:]))
:郵政編碼列表和數字列表
遍歷列表>遍歷列表的項(字母數字)並構造字符和數字列表>然后構造元組列表。
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
假設列表中的元素格式正確,此代碼將起作用。 這意味着字母和數字的數量必須匹配!
如果密鑰已經存在,它將覆蓋該值。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.