《Python數據處理》7.2.4筆記:尋找唯一鍵的源碼修改——由於zip方法
一、原因:zip方法
參考《python中使用zip函數出現》,原因是爲了節約內存,python3基於此對此進行了優化,輸出只輸出對象的內存位置而不打印出來。而在python2中可以直接輸出到屏幕,
解決方法:需要增加list
源碼:
set_keys = set(
['%s-%s-%s' % (x_[0][1], x_[1][1], x_[2][1]) for x_ in zipped_data]
)#原爲x,c此處改爲x_
unique = [x_ for x_ in zipped_data
if not set_keys.remove('%s-%s-%s' % (x_[0][1], x_[1][1], x_[2][1]))
]
z直接運行報錯:TypeError: ‘zip’ object is not subscriptable
二、修改後
注:將之前的zipped_data變成了調用的函數,change_title()即爲zipped_data
def unique_value():
'''確定唯一值'''
try:
x_list = []
for x in change_title():
x_list.append(list(x))
# print(x_)
'''由於zip()的輸出需要list()化'''
set_keys = set(
['%s-%s-%s' % (x_[0][1], x_[1][1], x_[2][1]) for x_ in x_list]
)
print(len(set_keys))
unique = [x_ for x_ in x_list
if not set_keys.remove('%s-%s-%s' % (x_[0][1], x_[1][1], x_[2][1]))
]
'''此處not的含義在於保障移除,且unique爲唯一值的變量,如果少了not就會變成空集,因爲均被移除'''
pprint.pprint(unique)
print('存在唯一值-----------------------------------------------------------------------')
except:
print('不存在唯一值------------------------------------------------')
在這個列表推導式中:
unique = [x_ for x_ in x_list
if not set_keys.remove('%s-%s-%s' % (x_[0][1], x_[1][1], x_[2][1]))
]
if not 與if沒有區別,只是作爲列表推導式的一個條件,以remove()方法的keyerror作爲唯一值存在與否的標誌,無論是if 還是 if not對此並無不同,if 、 if not只是對unique具有不同,前者導致[],後者導致唯一值的輸出
if時:
if not時: