在Python中匿名化值列表

2024-05-20 18:43:29 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您有一个类似CSV文件的数据集,其中包含轻度敏感的信息,比如在12年级的英语课上谁给谁传递了一个便条。虽然如果这些数据泄露出去并不是一个危机,但最好去掉识别信息,这样数据就可以公开,与合作者共享等等。数据如下所示:

给予者、接受者:

Anna,Joe
Anna,Mark
Mark,Mindy
Mindy,Joe

如何处理这个列表,为每个名称分配一个唯一但任意的标识符,然后去掉这些名称并用Python中的所述标识符替换它们,从而得到如下结果:

1,2
1,3
3,4
4,2


Tags: 文件csv数据名称信息列表标识符mark
3条回答

您可以使用hash()生成一个唯一的任意标识符,它将始终为特定字符串返回相同的整数:

 with open("data1.txt") as f:
    lis=[x.split(",") for x in f]
    items=[map(lambda y:hash(y.strip()),x) for x in lis]
    for x in items:
        print ",".join(map(str,x))
   ....:         


-1319295970,1155173045
-1319295970,-1963774321
-1963774321,-1499251772
-1499251772,1155173045

也可以使用^{}

^{pr2}$

或者使用itertools的^{}配方改进我以前的答案,您可以得到确切的答案:

In [84]: c=count(1)

In [85]: def unique_everseen(iterable, key=None):
        seen = set()
        seen_add = seen.add
        if key is None:
                for element in ifilterfalse(seen.__contains__, iterable):
                        seen_add(element)
                        yield element
                else:
                        for element in iterable:
                                k = key(element)
                                if k not in seen:
                                        seen_add(k)
                                        yield element
   ....:                         

In [86]: with open("data1.txt") as f:
    lis=[map(str.strip,x.split(",")) for x in f]
    dic={}
    for x in unique_everseen(chain(*lis)):
        dic.setdefault(x.strip(),next(c))
    for x in lis:    
        print ",".join(str(dic[y.strip()]) for y in x)
   ....:         
1,2
1,3
3,4
4,2
names = """
Anna,Joe
Anna,Mark
Mark,Mindy
Mindy,Joe
"""

nameset = set((",".join(names.strip().splitlines())).split(","))

for i,name in enumerate(nameset):
    names = names.replace(name,str(i))

print names

2,1
2,3
3,0
0,1

您可以使用hash为每个名称获取唯一的ID可以使用字典将名称映射到其值(如果您希望数字如您的示例所示):

data = [("Anna", "Joe"), ("Anna", "Mark"), ("Mark", "Mindy"), ("Mindy", "Joe")]

names = {}
def anon(name):
    if not name in names:
        names[name] = len(names) + 1
    return names[name]

result = []

for n1, n2 in data:
    result.append((anon(n1), anon(n2)))

print names
print result

运行时将给出:

^{pr2}$

相关问题 更多 >