在Python中匿名化值列表

Fom*_*ite 2 python

假设您的数据集类似于包含温和敏感信息的CSV文件,例如谁在12年级英语课程中传递了一个注释.虽然如果这些数据消失不是危机,但剥离识别信息以便将数据公开,与协作者共享等等将是一件好事.数据看起来像这样:

给予者,收件人:

安娜,乔
安娜,马克·
马克,柯以敏
柯以敏,乔

你将如何处理这个列表,为每个名称分配一个唯一但任意的标识符,然后删除名称并用Python中的所述标识符替换它们,以便最终得到如下结果:

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

Ash*_*ary 5

您可以使用它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
Run Code Online (Sandbox Code Playgroud)

或者您也可以使用iterools.count:

In [80]: c=count(1)

In [81]: with open("data1.txt") as f:
    lis=[map(str.strip,x.split(",")) for x in f]
    dic={}
    for x in set(chain(*lis)):
        dic.setdefault(x.strip(),next(c))
    for x in lis:    
        print ",".join(str(dic[y.strip()]) for y in x)
   ....:         
3,2
3,4
4,1
1,2
Run Code Online (Sandbox Code Playgroud)

或者使用unique_everseenitertools中的配方改进我以前的答案,你可以得到确切的答案:

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
Run Code Online (Sandbox Code Playgroud)