假设您有一个类似于 CSV 文件的数据集,其中包含一些敏感信息,例如在 12 年级的英语课上谁给谁传了纸条。虽然如果这些数据外泄不是危机,但最好去掉识别信息,这样数据就可以公开、与合作者共享等。数据看起来像这样:
给予者、接受者:
Anna,Joe
Anna,Mark
Mark,Mindy
Mindy,Joe
您将如何处理这个列表,为每个名称分配一个唯一但任意的标识符,然后删除名称并用 Python 中的所述标识符替换它们,这样您最终会得到如下内容:
1,2
1,3
3,4
4,2
最佳答案
您可以使用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
或者您也可以使用 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
或使用 unique_everseen
改进我之前的回答来自 itertools 的 recipe,你可以得到准确的答案:
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
关于python - 在 Python 中匿名化值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13412248/