comments | difficulty | edit_url | tags | |
---|---|---|---|---|
true |
中等 |
|
表:Samples
+----------------+---------+ | Column Name | Type | +----------------+---------+ | sample_id | int | | dna_sequence | varchar | | species | varchar | +----------------+---------+ sample_id 是这张表的唯一主键。 每一行包含一个 DNA 序列以一个字符(A,T,G,C)组成的字符串表示以及它所采集自的物种。
生物学家正在研究 DNA 序列中的基本模式。编写一个解决方案以识别具有以下模式的 sample_id
:
- 以 ATG 开头 的序列(一个常见的 起始密码子)
- 以 TAA,TAG 或 TGA 结尾 的序列(终止密码子)
- 包含基序 ATAT 的序列(一个简单重复模式)
- 有 至少
3
个连续 G 的序列(如 GGG 或 GGGG)
返回结果表以 sample_id 升序 排序。
结果格式如下所示。
示例:
输入:
Samples 表:
+-----------+------------------+-----------+ | sample_id | dna_sequence | species | +-----------+------------------+-----------+ | 1 | ATGCTAGCTAGCTAA | Human | | 2 | GGGTCAATCATC | Human | | 3 | ATATATCGTAGCTA | Human | | 4 | ATGGGGTCATCATAA | Mouse | | 5 | TCAGTCAGTCAG | Mouse | | 6 | ATATCGCGCTAG | Zebrafish | | 7 | CGTATGCGTCGTA | Zebrafish | +-----------+------------------+-----------+
输出:
+-----------+------------------+-------------+-------------+------------+------------+------------+ | sample_id | dna_sequence | species | has_start | has_stop | has_atat | has_ggg | +-----------+------------------+-------------+-------------+------------+------------+------------+ | 1 | ATGCTAGCTAGCTAA | Human | 1 | 1 | 0 | 0 | | 2 | GGGTCAATCATC | Human | 0 | 0 | 0 | 1 | | 3 | ATATATCGTAGCTA | Human | 0 | 0 | 1 | 0 | | 4 | ATGGGGTCATCATAA | Mouse | 1 | 1 | 0 | 1 | | 5 | TCAGTCAGTCAG | Mouse | 0 | 0 | 0 | 0 | | 6 | ATATCGCGCTAG | Zebrafish | 0 | 1 | 1 | 0 | | 7 | CGTATGCGTCGTA | Zebrafish | 0 | 0 | 0 | 0 | +-----------+------------------+-------------+-------------+------------+------------+------------+
解释:
- 样本 1(ATGCTAGCTAGCTAA):
- 以 ATG 开头(has_start = 1)
- 以 TAA 结尾(has_stop = 1)
- 不包含 ATAT(has_atat = 0)
- 不包含至少 3 个连续 ‘G’(has_ggg = 0)
- 样本 2(GGGTCAATCATC):
- 不以 ATG 开头(has_start = 0)
- 不以 TAA,TAG 或 TGA 结尾(has_stop = 0)
- 不包含 ATAT(has_atat = 0)
- 包含 GGG(has_ggg = 1)
- 样本 3(ATATATCGTAGCTA):
- 不以 ATG 开头(has_start = 0)
- 不以 TAA,TAG 或 TGA 结尾(has_stop = 0)
- 包含 ATAT(has_atat = 1)
- 不包含至少 3 个连续 ‘G’(has_ggg = 0)
- 样本 4(ATGGGGTCATCATAA):
- 以 ATG 开头(has_start = 1)
- 以 TAA 结尾(has_stop = 1)
- 不包含 ATAT(has_atat = 0)
- 包含 GGGG(has_ggg = 1)
- 样本 5(TCAGTCAGTCAG):
- 不匹配任何模式(所有字段 = 0)
- 样本 6(ATATCGCGCTAG):
- 不以 ATG 开头(has_start = 0)
- 以 TAG 结尾(has_stop = 1)
- 包含 ATAT(has_atat = 1)
- 不包含至少 3 个连续 ‘G’(has_ggg = 0)
- 样本 7(CGTATGCGTCGTA):
- 不以 ATG 开头(has_start = 0)
- 不以 TAA,TAG 或 TGA 结尾(has_stop = 0)
- 不包含 ATAT(has_atat = 0)
- 不包含至少 3 个连续 ‘G’(has_ggg = 0)
注意:
- 结果以 sample_id 升序排序
- 对于每个模式,1 表示该模式存在,0 表示不存在
我们可以利用 LIKE
和 REGEXP
来进行模式匹配,其中:
- LIKE
'ATG%'
检测是否以 ATG 开头 - REGEXP
'TAA$|TAG$|TGA$'
检测是否以 TAA、TAG 或 TGA 结尾($ 表示字符串结尾) - LIKE
'%ATAT%'
检测是否包含 ATAT - REGEXP
'GGG+'
检测是否包含至少 3 个 G
# Write your MySQL query statement below
SELECT
sample_id,
dna_sequence,
species,
dna_sequence LIKE 'ATG%' AS has_start,
dna_sequence REGEXP 'TAA$|TAG$|TGA$' AS has_stop,
dna_sequence LIKE '%ATAT%' AS has_atat,
dna_sequence REGEXP 'GGG+' AS has_ggg
FROM Samples
ORDER BY 1;
import pandas as pd
def analyze_dna_patterns(samples: pd.DataFrame) -> pd.DataFrame:
samples["has_start"] = samples["dna_sequence"].str.startswith("ATG").astype(int)
samples["has_stop"] = (
samples["dna_sequence"].str.endswith(("TAA", "TAG", "TGA")).astype(int)
)
samples["has_atat"] = samples["dna_sequence"].str.contains("ATAT").astype(int)
samples["has_ggg"] = samples["dna_sequence"].str.contains("GGG+").astype(int)
return samples.sort_values(by="sample_id").reset_index(drop=True)