【问题标题】:working with 2 lists使用 2 个列表
【发布时间】:2012-08-29 00:01:09
【问题描述】:

我有两个列表:一个只包含数字,而另一个包含字符串。例如:

listA = [ 3, 4, 5, 7]

listB = ["Z2 O95409 V595 **p.His3Leu** Dase - Hophaly type 5 (HPE5) [609637]", "Z2 O95409 V595 **p.His4Leu** Dase - Hophaly type 5 (HPE5) [609637]", "Z2 O95409 V595 **p.His5Leu** Dase - Hophaly type 5 (HPE5) [609637]", "Z2 O95409 V595 **p.His7Leu** Dase - Hophaly type 5 (HPE5) [609637]" ]

我想匹配 listA 中的数字和 listB 中的粗体字。最终,当我使用 listA 的数量时,我想打印整个 listB 字符串。例如,如果我在 listA 中使用数字 3,我还想打印出来:Z2 O95409 V595 **p.His3Leu** Dase - Hophaly type 5 (HPE5) [609637]

【问题讨论】:

  • 我错过了一些东西 - 为什么不print listA[0], listB[0]?此外,编辑去掉了粗体字。另外,听起来您应该使用字典。
  • @MatthewAdams 所以我基本上必须使用 listA 中的数字在程序中进行计算,如果 listA 中的数字有效,那么我想打印与该数字相关的文本。我有很多截至目前,我的结果重复,这是错误的。

标签: python


【解决方案1】:

就像在字典里一样?使用zip

listAtoB = dict(zip(listA, listB))

listAtoB[3] # Z2 O95409 V595 **p.His3Leu** Dase - Hophaly type 5 (HPE5) [609637]

【讨论】:

  • 我将如何使用它?所以我使用 listA 中的数字来计算,如果 listA 中的数字有效,那么我应该打印与 listA 中的数字相关的文本
  • @ChadD:假设您在listA 中的号码是x,那么它就是print(listAtoB[x])
  • 当我使用 dict(zip(listA, listB)) 时出现此错误 --> TypeError: 'dict' object is not callable
  • @ChadD:你有没有调用你的变量之一dict?不要那样做:)
  • 哦,谢谢这就是我遇到错误的地方,但是如果 listA 上有两个 3,即使两个列表中的索引数量相同,该怎么办。我还能用 dict(zip(listA, listB))
【解决方案2】:

这样的?

listA = [ 3, 4, 5, 7]
ListB = ["Z2 O95409 V595 p.His3Leu Dase - Hophaly type 5 (HPE5) [609637]", "Z2 O95409 V595 p.His4Leu Dase - Hophaly type 5 (HPE5) [609637]", "Z2 O95409 V595 p.His5Leu Dase - Hophaly type 5 (HPE5) [609637]", "Z2 O95409 V595 p.His7Leu Dase - Hophaly type 5 (HPE5) [609637]"]
for x in listA:
    for y in ListB:
        if y[y.index("p.His")+5]==str(x): #if x in "p.HisxLeu"
            print x,y

或使用filter():

for x in listA:
    for y in filter(lambda z:z[z.index("p.His")+5]==str(x),ListB):
        print x,y

输出:

3 Z2 O95409 V595 p.His3Leu Dase - Hophaly type 5 (HPE5) [609637]
4 Z2 O95409 V595 p.His4Leu Dase - Hophaly type 5 (HPE5) [609637]
5 Z2 O95409 V595 p.His5Leu Dase - Hophaly type 5 (HPE5) [609637]
7 Z2 O95409 V595 p.His7Leu Dase - Hophaly type 5 (HPE5) [609637]

【讨论】:

  • @ChadD 这里index()会返回p这里的索引,所以为了得到s之后的字符的值我已经加了5。
【解决方案3】:

创建将 listA 中的项目映射到 ListB 中的项目的字典很容易。如果您使用的是 Python >= 2.7,则可以使用字典理解(如果没有,请参阅其他使用 dict 来实现相同的答案):

listA = [ 3, 4, 5, 7]
ListB = ['Z2 O95409 V595 **p.His3Leu** Dase - Hophaly type 5 (HPE5) [609637]', 'Z2 O95409 V595 **p.His4Leu** Dase - Hophaly type 5 (HPE5) [609637]', 'Z2 O95409 V595 **p.His5Leu** Dase - Hophaly type 5 (HPE5) [609637]', 'Z2 O95409 V595 **p.His7Leu** Dase - Hophaly type 5 (HPE5) [609637]' ]

d = { a:b for a, b in zip(listA, ListB) }
from pprint import pprint
pprint(d)
{3: 'Z2 O95409 V595 **p.His3Leu** Dase - Hophaly type 5 (HPE5) [609637]',
 4: 'Z2 O95409 V595 **p.His4Leu** Dase - Hophaly type 5 (HPE5) [609637]',
 5: 'Z2 O95409 V595 **p.His5Leu** Dase - Hophaly type 5 (HPE5) [609637]',
 7: 'Z2 O95409 V595 **p.His7Leu** Dase - Hophaly type 5 (HPE5) [609637]'}

但是,鉴于您的要求,我建议使用字典词典来查找蛋白质名称及其完整描述。

d = { a: {'protein': b.split('**')[1], 'description': b} for a, b in zip(listA, ListB) }
pprint(d)
{3: {'description': 'Z2 O95409 V595 **p.His3Leu** Dase - Hophaly type 5 (HPE5) [609637]',
     'protein': 'p.His3Leu'},
 4: {'description': 'Z2 O95409 V595 **p.His4Leu** Dase - Hophaly type 5 (HPE5) [609637]',
     'protein': 'p.His4Leu'},
 5: {'description': 'Z2 O95409 V595 **p.His5Leu** Dase - Hophaly type 5 (HPE5) [609637]',
     'protein': 'p.His5Leu'},
 7: {'description': 'Z2 O95409 V595 **p.His7Leu** Dase - Hophaly type 5 (HPE5) [609637]',
     'protein': 'p.His7Leu'}}

现在您可以执行如下查找:

>>> print d[3]['protein']
p.His3Leu
>>> print d[3]['description']
Z2 O95409 V595 **p.His3Leu** Dase - Hophaly type 5 (HPE5) [609637]

【讨论】:

  • 我喜欢嵌套的字典,但我认为“**”实际上并不作为行中的子字符串存在。我很确定这些是由 OP 引入的,以加粗这些词,并且在进行编辑以标记代码块时,星号变得可见。
  • @DSM:谢谢,是的,我怀疑“**”也只是标记,但这就是问题中所说的。很容易将 split() 更改为适合数据的内容,假设固定宽度的字段,或者使用正则表达式匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 2018-01-22
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多