【问题标题】:For each value in 1 dictionary take keys and for those keys in 2 dictionary print difference in values for all specific pairs of keys对于 1 个字典中的每个值获取键,对于 2 个字典中的那些键,打印所有特定键对的值差异
【发布时间】:2020-09-21 14:13:43
【问题描述】:

这是我第一次来这里很抱歉,如果我不遵守社区的一些潜规则 所以我有一本字典 mydict

{'ENST00000309502': ['ADORA1'],
 'ENST00000337894': ['ADORA1'],
 'ENST00000618295': ['ADORA1'],
 'ENST00000380573': ['ADRA1A'],
 'ENST00000519229': ['ADRA1A'],
 'ENST00000337474': ['AVPR2'],
 'ENST00000358927': ['AVPR2'],
 'ENST00000370049': ['AVPR2'],
 'ENST00000216629': ['BDKRB1'],
 'ENST00000611804': ['BDKRB1']...}

对于每个特定值,我需要获取第二个字典 mydict2 中的键

{'ENST00000216629':['3.61','3.45','3.65'...]
'ENST00000255380':['3.1','3.05','3.15'...]
'ENST00000304421':['3.61','3.15','3.65'...]...}

而且我需要为 mydict 中相同值的每个键找到 mydict2 值的差异 并像这样打印结果

mydict[value] mydict2[key1] mydict2[key2] difference(list of values)

ADORA1 ENST00000309502 ENST00000337894 [3.61,3.25,3.14]

我只需要一种差异组合,所以只有 1-2 而不是 2-1 对于 mydict 中的某些值,有两个以上的键。 很抱歉,我是编程新手,我知道我需要 if 循环,但我不知道如何编写它。 提前感谢任何提供帮助的人。

【问题讨论】:

  • 什么是key1key2
  • difference 是什么?
  • 首先向我们展示您的尝试。
  • key1 和 key2 是 mydict 中每个值的 ENST 对,例如对于 ADORA1,我们有 3 个 ENST,我需要比较它们在 mydict2 中的值,以便找出哪个元素在一个而不是另一个对于三个的所有组合
  • 欢迎来到 Stack Overflow!请拨打tour,阅读what's on-topic hereHow to Ask,并提供minimal reproducible example。 “为我实现此功能”与此站点无关。您必须做出诚实的尝试,然后针对您的算法或技术提出具体问题。

标签: python python-3.x loops dictionary


【解决方案1】:

为了遍历mydict 中的所有可能值,我们需要mydict 中的一组值。 假设每个值(例如 ['ADORA1'])都是一个包含一个元素的列表,我们可以将列表展平并使用以下方法创建一组值

set_of_values = {value[0] for value in mydict.values()}

然后,我们需要每个值对应的 mydict 键列表。 我们可以使用列表推导并创建一个新字典,将每个 mydict 值映射到 mydict 键列表。

reversed_dict = {v:[key for (key, value) in mydict.items() if value[0] == v] for v in set_of_values}

其余的很简单。对于 reversed_dict 中的每个键,我们可以打印出对应的 mydict 键和 mydict2 值。

for (key, values) in reversed_dict.items():
    print(f'{key} {values[0]} {values[1]} {mydict2[values[0]]} {mydict2[values[1]]}')

这将打印出来

ADORA1 ENST00000309502 ENST00000337894 [3.61,3.25,3.14, ...] ['3.1','3.05','3.15'...]

例如。

不清楚列表的区别是什么。如果您需要设置差异,您可以使用 python set using,例如,

set1 = set(mydict2[values[0]])
set2 = set(mydict2[values[1]])
print(set1 - set2)

【讨论】:

  • 非常感谢,这几乎是我一直在寻找的,是的,不同之处在于打印一个 ENST 中不在另一个中的元素,只是一个问题,一些值有多个 ENSt 3 或 4,所以如何我要打印那些 ENST 对的所有组合吗
【解决方案2】:

我假设您正在寻找这样的东西:

# Loop over the "values" in mydict1 (i.e. the string in the value)
for value in {value[0] for value in mydict1.values()}:
    
    # Find the keys in mydict1 that correspond to the selected value
    keys = tuple(key for key in mydict1 if mydict1[key] == [value])

    # Loop over pairs of distinct keys
    num_of_keys = len(keys)
    for key1, key2 in {(keys[i], keys[j])
                       for i in range(num_of_keys)
                       for j in range(i+1, num_of_keys)}:

        # Check if both keys are keys in mydict2
        if (key1 in mydict2) and (key2 in mydict2):
            
            # Calculate the difference: The elements of the values (lists) 
            # of mydict2 are strings, not numbers: What do you mean by 
            # 'difference'?
            difference = [(float(mydict2[key1]) - float(mydict2[key2][i]))
                          for i in range(len(mydict2[key1]))]

            print(value, key1, key2, difference)

有些事情有点奇怪:

  • 如果你真的对字符串感兴趣,为什么 mydict1 列表的值只包含一个字符串(这不是问题,只是有点奇怪)?

  • 什么是“差异”? mydict2(列表)的值中的元素是字符串,而不是数字?

编辑:好的,对于那种“差异”,我会尝试:

    ....
        
        # Check if both keys are keys in mydict2
        if (key1 in mydict2) and (key2 in mydict2):
            
            # Select all values from mydict2[key1] that are not in
            # mydict2[key2]
            difference = set(mydict2[key1]).difference(set(mydict2[key2]))
            
            print(value, key1, key2, difference)

或者使用列表推导:

    ....
        
        # Check if both keys are keys in mydict2
        if (key1 in mydict2) and (key2 in mydict2):
            
            # Select all values from mydict2[key1] that are not in
            # mydict2[key2]
            difference = [value
                          for value in mydict2[key1] 
                          if value not in mydict2[key2]]
            
            print(value, key1, key2, difference)

【讨论】:

  • 所以区别在于第一个 ENST 中的哪些元素与第二个 ENST 中的元素进行比较并打印这些元素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2017-08-07
相关资源
最近更新 更多