Python 在字典中查找重复的值并仅在具有相同键的值不同的情况下打印它们

Python 在字典中查找重复的值并仅在具有相同键的值不同的情况下打印它们,python,python-3.x,csv,dictionary,Python,Python 3.x,Csv,Dictionary,我正在从一个CSV文件创建一个三元组字典,其中包含一个包含三个整数的列表中的键-行号和值。我还创建了另一个字典(名称),其中有一个键,即行号和两个字符串的列表值。我想找到包含相同三元组的所有行,以防名称对不同 到目前为止,我的代码是在两行上有相同的三元组值的情况下查找所有重复项,但在3行或更多行上有重复项的情况下,它将无法正常工作。我想更新或重新编写整个脚本,以便在3次或更多重复的情况下检查所有名称值是否不同,并仅打印具有不同名称的行。例如,如果我们有以下三元组字典: triplet={1:[1

我正在从一个CSV文件创建一个三元组字典,其中包含一个包含三个整数的列表中的键-行号和值。我还创建了另一个字典(名称),其中有一个键,即行号和两个字符串的列表值。我想找到包含相同三元组的所有行,以防名称对不同

到目前为止,我的代码是在两行上有相同的三元组值的情况下查找所有重复项,但在3行或更多行上有重复项的情况下,它将无法正常工作。我想更新或重新编写整个脚本,以便在3次或更多重复的情况下检查所有名称值是否不同,并仅打印具有不同名称的行。例如,如果我们有以下三元组字典:
triplet={1:[111222333],2:[111222333],3:[111222333],}
names={1:['name1',name2'],2:['name1',name2'],3:['name1',name3']}
这将导致创建另一个字典:
重复的值键={(111222333):[1,2,3]}
和我的脚本不会显示重复,因为
名称[1]==名称[2]
但原则上它应该打印第2行和第3行上的三元组值具有不同的名称

for csv_infile in os.listdir(input_dir):
        if csv_infile.lower().endswith('.csv'):
            csv_in = os.path.join(input_dir, csv_infile)
            with open(csv_in) as f_in:
                # Creating dictionaries containing as a key the line number and as a value
                triplet = {}
                names = {}
                l_num = 0
                for line in f_in:
                    l_num += 1
                    triplet[l_num] = [(line.split('\t')[1]), (line.split('\t')[2]), (line.split('\t')[3])]
                    names[l_num] = [(line.split('\t')[4].lower().strip()), (line.split('\t')[5].lower().strip())]

                # Finding the duplicated values and creating a new dictionary with values the line numbers.
                duplicated_value_keys = collections.defaultdict(list)
                for key, value in triplet.items():
                    duplicated_value_keys[tuple(value)].append(key)
                for duplicated_keys in duplicated_value_keys.values():
                    if len(duplicated_keys) >1 and names[duplicated_keys[0]] != names[duplicated_keys[1]]: 
                        print("There is a duplicated triplet on lines: {}.\n".format(', '.join(map(str, duplicated_keys))))            
[编辑]:CSV输入文件具有以下格式,并且以制表符分隔:

2       8004    3014    3       test name   1       14080   1       0       3478    1572    0       0
2       8004    3014    3       test name    1       8004    1       0       3478    1572    0       0
3       8004    3014    3       test name1   1       8004    1       0       3477    1571    0       0

可以使用
defaultdict(list)
检测重复行。三元组是字典的键,每个元组都包含一个行号列表和找到三元组的名称。在中读取所有条目后,遍历字典并仅显示包含不同名称的条目。例如:

import csv
from collections import defaultdict

triplets = defaultdict(list)

with open('test.csv', newline='') as f_input:
    csv_input = csv.reader(f_input, delimiter='\t')

    for line, row in enumerate(csv_input, start=1):
        triplets[tuple(row[1:4])].append((line, list(map(str.lower, row[4:6]))))

for triplet, entries in sorted(triplets.items()):
    if len(entries) > 1 and len({tuple(names) for line, names in entries}) > 1:
        print("Duplicate triplet: {} on lines:".format(triplet))
        for line, names in entries:
            print("  {}, {}, {}".format(line, *names))
        print()
对于给定的
test.csv
,这将产生:

行上的重复三元组:('13115','3209','3'):
44、天际线、horor电影
69,天际线,私人香料
重复三元组:('13139','3219','3')在行上:
诺瓦电影院天际线8号
13,天际线,prima zoom
重复三元组:('8004','3014','3')在行上:
2,天际线,ct 2
3,天际线,酒吧2
天际线4号,tst 22
天际线5号,tst 22

但在这里,我没有看到检查名称是否唯一。我的脚本已经输出了重复的三元组,然后我正在运行
if len(duplicated_key)>1和names[duplicated_key[0]!=名称[duplicated_keys[1]]:
但这只是检查前两次出现。您的示例的预期输出是什么?
第2、3行上的重复三元组:('8004','3014','3')因为第1行和第2行具有相同的
('test','name')
,只有第3行具有不同的
('test和name1'))
如果复制行的组合(第4列和第5列)不相同,我的脚本应该返回三元组第1列到第3列的行数(从0开始计数)。如果重复行的第4列和第5列相同,则不应报告重复。您可以在之前的行中添加
row=list(map(str.strip,row))
。仍然不清楚不同名称的含义。与第一个条目不同,每个条目不同?如果与第一个条目不同,则只显示最后一个条目。@MartinEvans,首先感谢您的帮助。通过使用不同的名称,我的意思是,只有当第4列和第5列中的条目与第1、2、3行不同时,脚本才应该显示重复的第1、2、3列中的行。例如,在我的CSV示例中,应该只报告第2行和第3行,因为第1行和第2行的第4列和第5列是相同的。