如何使用字母数字字符从单个列表创建元组?

时间:2016-09-11 23:46:30

标签: python list dictionary zip tuples

我有以下列表,包含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元素与其对应的数字配对的东西。

4 个答案:

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

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