簡體   English   中英

如何使用字母數字字符從單個列表創建元組?

[英]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')]]
  1. [i.split() for i in lst] :字符串的初始拆分。

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM