使用Python比较多值字典并提取公共值

72 阅读2分钟

我们需要比较两个字典,每个键有多个值,并提取公共值。这两个字典是从两个文件中读取的,每个文件中的列1是键,列2是与之关联的值,以"|"分隔。所有键可能不在两个文件中都存在。

huake_00015_.jpg 示例:

File1.txt

1   b|c    
2   a|b|d    
3   a|b|c    
4   a|b    
9   a|b|c

File2.txt

1   a|c  
2   a|b|c|d|e    
3   a|b|c    
6   a|b|c    
7   a|b|c    
8   a|b|c    
9   x|y

我们希望创建一个文件File3.txt,其中包含每个键的公共值,每个键都表示为一个单独的行。当键在两个列表中都不常见时,留空;当键常见但没有公共值共享时,则为"no matches"。(最后一部分是事后想法,因此不会出现在下面的代码中。)

示例:

File3.txt

1   c    
2   a|b|d    
3   a|b|c    
4       
6       
7       
8       
9   no matches

2. 解决方案

为了解决这个问题,我们可以使用Python的字典比较和提取公共值的函数。这里是一个可能的解决方案:

def intersect_two_dicts(dict1, dict2):
  """
  比较两个字典,每个键有多个值,并提取公共值。

  参数:
    dict1: 第一个字典。
    dict2: 第二个字典。

  返回值:
    一个包含公共值的字典。
  """

  # 创建一个新的字典来存储公共值。
  common_values = {}

  # 遍历第一个字典。
  for key, value in dict1.items():
    # 如果键在第二个字典中,并且两个字典中的值相同,则将该键和值添加到公共值字典中。
    if key in dict2 and value == dict2[key]:
      common_values[key] = value

  # 返回公共值字典。
  return common_values


# 读取两个文件。
with open('File1.txt') as f1, open('File2.txt') as f2:
  # 创建两个字典来存储文件中的数据。
  dict1 = {}
  dict2 = {}

  # 遍历第一个文件。
  for line in f1:
    # 将每一行拆分为键和值。
    key, value = line.strip().split('\t')

    # 将键和值添加到第一个字典中。
    dict1[key] = value

  # 遍历第二个文件。
  for line in f2:
    # 将每一行拆分为键和值。
    key, value = line.strip().split('\t')

    # 将键和值添加到第二个字典中。
    dict2[key] = value

# 调用intersect_two_dicts函数来比较两个字典并提取公共值。
common_values = intersect_two_dicts(dict1, dict2)

# 将公共值写入文件。
with open('File3.txt', 'w') as f3:
  for key, value in common_values.items():
    f3.write(f'{key}\t{value}\n')

代码示例:

# 读取文件
with open('File1.txt') as f1, open('File2.txt') as f2:
    # 创建字典
    dict1 = {}
    dict2 = {}

    # 将文件中的数据添加到字典中
    for line in f1:
        key, value = line.strip().split('\t')
        dict1[key] = value.split('|')

    for line in f2:
        key, value = line.strip().split('\t')
        dict2[key] = value.split('|')

# 比较字典并提取公共值
common_values = {}
for key, value in dict1.items():
    if key in dict2 and set(value) & set(dict2[key]):
        common_values[key] = list(set(value) & set(dict2[key]))

# 将公共值写入文件
with open('File3.txt', 'w') as f3:
    for key, value in common_values.items():
        f3.write(f'{key}\t{"|".join(value)}\n')

运行此代码将生成File3.txt,其中包含两个字典的公共值。