我有一个包含 8 列和 100 多行的文件,如下所示:
PAIR 1MFK 1 URANIUM 82 HELIUM 112 3.6997
PAIR 2JGH 2 PLUTONIUM 98 POTASSIUM 88 5.3003
PAIR 345G 3 SODIUM 23 CARBON 14 1.664
PAIR 4IG5 4 LITHIUM 82 ARGON 99 2.5506
我想要做的是比较第 5 列以找出任何值的重复,然后生成一个包含两个完整行的输出文件。
我有一个包含 8 列和 100 多行的文件,如下所示:
PAIR 1MFK 1 URANIUM 82 HELIUM 112 3.6997
PAIR 2JGH 2 PLUTONIUM 98 POTASSIUM 88 5.3003
PAIR 345G 3 SODIUM 23 CARBON 14 1.664
PAIR 4IG5 4 LITHIUM 82 ARGON 99 2.5506
我想要做的是比较第 5 列以找出任何值的重复,然后生成一个包含两个完整行的输出文件。
用于str.split()
分割线
使用 acollections.defaultdict(list)
来跟踪重复
例如。
>>> lines = """PAIR 1MFK 1 URANIUM 82 HELIUM 112 3.6997
... PAIR 2JGH 2 PLUTONIUM 98 POTASSIUM 88 5.3003
... PAIR 345G 3 SODIUM 23 CARBON 14 1.664
... PAIR 4IG5 4 LITHIUM 82 ARGON 99 2.5506 """.split("\n")
>>>
>>> from collections import defaultdict
>>> D = defaultdict(list)
>>> for line in map(str.split, lines):
... k = line[4]
... D[k].append(line)
...
>>> [v for k,v in D.items() if len(v) > 1]
[[['PAIR', '1MFK', '1', 'URANIUM', '82', 'HELIUM', '112', '3.6997'], ['PAIR', '4IG5', '4', 'LITHIUM', '82', 'ARGON', '99', '2.5506']]]
>>> [(k,v) for k,v in D.items() if len(v) > 1]
[('82', [['PAIR', '1MFK', '1', 'URANIUM', '82', 'HELIUM', '112', '3.6997'], ['PAIR', '4IG5', '4', 'LITHIUM', '82', 'ARGON', '99', '2.5506']])]
这是另一种使用方式setdefault
(即,您不必导入collections
:
>>> lines = [
... 'PAIR 1MFK 1 URANIUM 82 HELIUM 112 3.6997',
... 'PAIR 2JGH 2 PLUTONIUM 98 POTASSIUM 88 5.3003',
... 'PAIR 345G 3 SODIUM 23 CARBON 14 1.664',
... 'PAIR 4IG5 4 LITHIUM 82 ARGON 99 2.5506',
... 'PAIR AB32 4 KRYPONITE 98 ARSENIC 99 2.3406'
... ]
>>> d = {}
>>> for line in lines:
... d.setdefault(line.split()[4], []).append(line)
...
>>> [(k, v) for k,v in d.items() if len(v) > 1 ]
[('82', ['PAIR 1MFK 1 URANIUM 82 HELIUM 112 3.6997', 'PAIR 4IG5 4 LITHIUM 82 ARGON 99 2.5506']), ('98', ['PAIR 2JGH 2 PLUTONIUM 98 POTASSIUM 88 5.3003', 'PAIR
B32 4 KRYPONITE 98 ARSENIC 99 2.3406'])]