簡體   English   中英

Python 字典匹配鍵的任何元素

[英]Python dictionary match any element of key

如果一個人有如下的字典:

aminoacids = {
    ("GAU", "GAC"): "Asp",
    ("GAA", "GAG"): "Glu",
    ("UGU", "UGC"): "Cys",
}

有沒有辦法匹配鍵的任何元素來獲取值?

我試過簡單地使用get

aminoacids.get("GAA")

它返回 None,因為它不嚴格匹配整個鍵,盡管"GAA"包含在值為"Glu"的鍵中。

有沒有辦法獲得以下行為:

>>> aminoacids = {
    ("GAU", "GAC"): "Asp",
    ("GAA", "GAG"): "Glu",
    ("UGU", "UGC"): "Cys",
}

>>> aminoacids.someFunction("GAA")
>>> "Glu"

我檢查了文檔,但似乎沒有 function 。

有任何想法嗎? 謝謝!

不,沒有。 相反,使用字典的替代形式,可以有重復的值,所以:

amino acids ={
    "GUA": "Asp",
    "GAC": "Asp",
    "GAA": "Glu",
    "GAG": "Glu",
    "UGU": "Cys",
    "UGC": "Cys"
}

如果你想讓設置比完整的 64 鍵字典更簡潔,你可以首先設置一個列表(或元組)字典,每個氨基酸一個,然后構建你的 base->amino 查找表格如下:

from itertools import product
bases = 'UCAG'
amino_codes = dict(Asp=('GAU','GAC'),
                     Glu=('GAA', 'GAC'),
                     Leu=['CU'+b for b in bases] + ['UUA','UUG'],
                     Ser=['UC'+b for b in bases],  # list comprehensions just to show the concept
                     Stop=('UAA,UAG,UGA') # You do the rest
                     )

bases_to_amino = {}
for triplet in product(bases, repeat=3):
    base_key = ''.join(triplet)
    amino = next((a for (a, pat) in amino_codes.items() if base_key in pat), 'missing')
    bases_to_amino[base_key] = amino
    
from pprint import pprint
pprint(bases_to_amino)

{'AAA': 'missing',
 'AAC': 'missing',
 'AAG': 'missing',
 'AAU': 'missing',
 'ACA': 'missing',
 'ACC': 'missing',
 'ACG': 'missing',
 'ACU': 'missing',
 'AGA': 'missing',
 'AGC': 'missing',
 'AGG': 'missing',
 'AGU': 'missing',
 'AUA': 'missing',
 'AUC': 'missing',
 'AUG': 'missing',
 'AUU': 'missing',
 'CAA': 'missing',
 'CAC': 'missing',
 'CAG': 'missing',
 'CAU': 'missing',
 'CCA': 'missing',
 'CCC': 'missing',
 'CCG': 'missing',
 'CCU': 'missing',
 'CGA': 'missing',
 'CGC': 'missing',
 'CGG': 'missing',
 'CGU': 'missing',
 'CUA': 'Leu',
 'CUC': 'Leu',
 'CUG': 'Leu',
 'CUU': 'Leu',
 'GAA': 'Glu',
 'GAC': 'Asp',
 'GAG': 'missing',
 'GAU': 'Asp',
 'GCA': 'missing',
 'GCC': 'missing',
 'GCG': 'missing',
 'GCU': 'missing',
 'GGA': 'missing',
 'GGC': 'missing',
 'GGG': 'missing',
 'GGU': 'missing',
 'GUA': 'missing',
 'GUC': 'missing',
 'GUG': 'missing',
 'GUU': 'missing',
 'UAA': 'Stop',
 'UAC': 'missing',
 'UAG': 'Stop',
 'UAU': 'missing',
 'UCA': 'Ser',
 'UCC': 'Ser',
 'UCG': 'Ser',
 'UCU': 'Ser',
 'UGA': 'Stop',
 'UGC': 'missing',
 'UGG': 'missing',
 'UGU': 'missing',
 'UUA': 'Leu',
 'UUC': 'missing',
 'UUG': 'Leu',
 'UUU': 'missing'}

在這種情況下,您不會從練習中獲得太多東西,但是對於需要處理超過 64 種排列的類似情況,這些概念可能很有價值。

旁注:

  • 純粹主義者可能不喜歡我在amino_codes中混合元組和列表的方式。 我會接受這是一個較輕的罪行。
  • amino = next(blah)用於在找到匹配項后停止尋找匹配項。
  • 您可以使用嵌套生成器理解進一步壓縮最后 5 行代碼。 這樣做的智慧是一個品味問題

.

find_amino = lambda t: next((a for (a, pat) in amino_codes.items() if t in pat), 'missing')
bases_to_amino = dict((bk, find_amino(bk)) for bk in (''.join(t) for t in product(bases, repeat=3)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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