【问题标题】:Check if a value in a dictionary is a substring of another key-value pair in Python检查字典中的值是否是 Python 中另一个键值对的子字符串
【发布时间】:2022-11-02 22:07:29
【问题描述】:

我有一个字典 disease_dict ,其中包含列表元素中的值。我想获取特定键的键和值,然后检查该值(作为子字符串)是否存在于其他键中并获取所有键 --> 值对。

例如,这是字典。我想看看字典中是否存在'Stroke'或'stroke',然后匹配这个键的值是否是其他值的子字符串(如'C10.228.140.300.775'存在于'C10.228.140.300.275' .800', 'C10.228.140.300.775.600')

'Stroke': ['C10.228.140.300.775', 'C14.907.253.855'], 'Stroke, Lacunar': ['C10.228.140.300.275.800', 'C10.228.140.300.775.600', 'C14.907.253.329.800', 'C14.907.253.855.600']

我有以下代码行用于获取特定术语的键和值。

#extract all child terms
for k, v in dis_dict.items():
    if (k in ['Glaucoma', 'Stroke']) or (k in ['glaucoma', 'stroke']):
        disease = k
        tree_id = v
        print (disease, tree_id)
    else:
        disease = ''
        tree_id = ''
        continue

非常感谢任何帮助!

【问题讨论】:

  • “存在”是什么意思? 'C10.228.140.300.775' 和 'C10.228.140.300.275.800' 不相等,你认为什么匹配?
  • 我的意思是它是另一个值的子字符串。
  • C10已经匹配了吗? C10 之后有多少项。必须相等才能被视为与另一个值匹配?
  • 它应该是完全匹配的('C10.228.140.300.775')。
  • 例如,'1' 将是存在于大多数其他值中的有效子字符串,但这不是您想要得到的......所以有多少 C10.228。 ...条款必须被视为匹配?

标签: python pandas dictionary substring


【解决方案1】:

您有一个很好的起点,并且您可能已经知道,您需要处理拆分它的密钥。您可以这样做:

disease_dict = { 'Stroke': ['C10.228.140.300.775', 'C14.907.253.855'], 'Stroke, Lacunar': ['C10.228.140.300.275.800', 'C10.228.140.300.775.600', 'C14.907.253.329.800', 'C14.907.253.855.600'], 'Flue' : ['C10.228.140.300.780'] } 

for k, v in disease_dict.items():
    tmp = ''.join(x for x in k if x.isalpha() or x == '-' or x == ' ')
    tmpKey = tmp.split(' ')
    for tk in tmpKey:
        if tk.capitalize() in ['Stroke', 'Glaucoma']:
            print(k, v, end= ' ') # To remove the new line ending

print(notable_diseases)

首先,我们使用这一行删除不必要的字符:

tmp = ''.join(x for x in k if x.isalpha() or x == ' ' or x == '-')

它只保留字母字符、空格和破折号。因为我不知道你的病是什么样子的,所以我只保留了那些字符(下一行需要空格)。 创建这个新的格式化键后,我们用空格分割它,然后比较子字符串。

tmpKey = tmp.split(' ')

一旦创建了tmpKey,我们就会遍历它以检查您想要的疾病是否属于原始密钥。

for tk in tmpKey:
    if tk.capitalize() in ['Stroke', 'Glaucoma']:
        print(k, v, end= ' ') # To remove the new line ending

tk.capitalize() 用于首字母大写,因此您不必检查单词的两种形式。

最后,运行上面的脚本后,我们得到了:

Stroke ['C10.228.140.300.775', 'C14.907.253.855'] Stroke, Lacunar ['C10.228.140.300.275.800', 'C10.228.140.300.775.600', 'C14.907.253.329.800', 'C14.907.253.855.600'] 

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2020-03-15
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多