簡體   English   中英

在Python中找出兩個字典之間的匹配項

[英]Finding out matches between two dictionaries in Python

我有兩個文件“ seen.txt”和“ members.txt”。 第一個文件“ seen.txt”列出了看過帖子的人。 該文件的結構如下:

Friend/Not Friend
Name #1
Number of mutual friends

Friend/Not Friend
Name #2
Number of mutual friends

第二個文件“ members.txt”列出了組中所有人員的詳細信息。 該文件的結構如下:

Name #1
Some info about the person
Some more info about the person

Name #2
Some info about the person
Some more info about the person

現在,我想創建一個程序以顯示成員的姓名,但不在可見列表中。 為此,我創建了兩個字典,用於存儲每個文件的名稱。 完成之后,我只需遍歷members_list中的每個成員,然后查看它們是否在seened_list中。 如果不是,我會在控制台中打印出名稱。

這是我編寫的代碼:

seen = open('seen.txt').readlines()
members = open('members.txt').readlines()

i = 0
j = 0

seen_list = {}
members_list = {}

for lines in seen:
    if i == 1:
        seen_list[lines.strip()] = 1
        i = 0
    else:
        i += 1

for lines in members:
    if j == 0 or j == 3: # to get the first line and every third line to extract name
        members_list[lines.strip()] = 1
        j = 6
    else:
        j -= 1

for member in members_list:
    if member not in seen_list:
        print member

我相信我的解決方案非常精細,可以用更短,更快的方式完成。 誰能告訴我有關此程序的一些很酷的python hack,以使其更高效,更短?

我可能會使用集合而不是字典,因為似乎您正在丟棄文件中的許多存儲信息,而只是在乎名稱。

我首先重組了從文件導入名稱的方式。 我使用izip_longest讀取了4行文件(3行文本加上空白行)。

from itertools import izip_longest

seen = set()
with open('seen.txt', 'r') as seen_file:
    for lines in izip_longest(*[seen_file]*4):
        name = lines[1].strip()
        seen.add(name)

members = set()
with open('members.txt', 'r') as members_file:
    for lines in izip_longest(*[members_file]*4):
        name = lines[0].strip()
        members.add(name)

然后,我們只考慮設定差異。 請參閱此處的設置操作

not_seen = members - seen
for member in not_seen: print member
seen = open('seen.txt').readlines()
members = open('members.txt').readlines()

i = 0
j = 0

seen_list = set()
members_list = set()

for lines in seen:
    seen_list.add(lines.strip())

for j, lines in enumerate(members):
    if (j==0) or (j%3 == 0):
        members_list.add(lines.strip())

for member in members_list:
    if member not in seen_list:
        print member

members_list是一個字典,所以是seen_list

顯然,它們只帶有一個值1,並且每個鍵具有相同的值。 您可以使用set簡化此過程。

members_list = set()

並添加項目:

members_list.add(lines.strip())

那么你有幾組有用的功能,其中包括difference

members_not_in_seen = members_list.difference(seen_list)

也可以寫成

members_list - seen_list

但是您可以簡化閱讀部分:您可以使用切片和映射,而不是自己處理ij計數器並在每個項目上調用條帶:

import string
members_list = set(map(string.strip, members[1::2])
seen_list = set(map(string.strip, seen[::4])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM