如何使用父 ID 和子 ID 丰富列表列表中的分层数据?
How to enrich hierarchical data in list of lists with parent and child ids?
假设我们有一些分层数据,以列表的形式表示:
list = [
['US', 'Central', 'Louisiana', 'Monroe']
['US', 'Central', 'Texas', 'Midland']
['US', 'Pacific', 'California', 'East Palo Alto']
['UK', 'Coastside', 'Sussex', 'Brighton']
]
而且我们喜欢以树结构的形式向每个项目添加分层 ID,因此要实现这一点:
list = [
[(key1,'US',None), (key3,'Central',key1), (key6,'Louisiana',key3), (key10,'Monroe',key6)]
[(key1,'US',None), (key3,'Central',key1), (key7,'Texas',key3), (key11,'Midland',key7]
[(key1,'US',None), (key4,'Pacific',key1), (key8,'California',key4), (key12,'East Palo Alto',key8]
[(key2,'UK',None), (key5,'Coastside',key2), (key9,'Sussex',key5) (key13,'Brighton',key9]
]
这是否可以用一些优雅的 python 构造来实现?我在 Excel 开始手动执行此操作,但由于初始数据结构非常庞大,这似乎是一项永无止境的任务...
主要有两个任务:
- 为每个单词生成密钥。
- 从键和您的列表自定义转换。
密钥生成: 我使用简单的逻辑为每个单词生成密钥,我按每个项目迭代列表,并使用计数方法为项目中的每个单词生成唯一的密钥。
注意:您可以根据您的要求更改此逻辑。
自定义转换:现在我们有键和列表,生成列表的新项目,这里主键是为新项目的每个单词添加前一个键,所以使用pre_key
变量存储前一个单词的前一个键并将默认值设置为 None
。
演示:
输入:
mylist = [
['US', 'Central', 'Louisiana', 'Monroe'],
['US', 'Central', 'Texas', 'Midland'],
['US', 'Pacific', 'California', 'East Palo Alto'],
['UK', 'Coastside', 'Sussex', 'Brighton'],
]
代码:
def keyGenerator(mylist):
result_keys = {}
count = 1
for item in mylist:
for i in item:
if i not in result_keys:
result_keys[i] = "key%03d"%count
count += 1
return result_keys
def customConversion(mylist, result_keys):
new_mylist = []
for item in mylist:
new_item = []
pre_key = None
for i in item:
current_key = result_keys[i]
new_item.append((current_key, i, pre_key))
pre_key = current_key
new_mylist.append(new_item)
return new_mylist
mylist = [
['US', 'Central', 'Louisiana', 'Monroe'],
['US', 'Central', 'Texas', 'Midland'],
['US', 'Pacific', 'California', 'East Palo Alto'],
['UK', 'Coastside', 'Sussex', 'Brighton'],
]
#- Generate Key to each Word.
result_keys = keyGenerator(mylist)
# Custom Conversion
new_mylist = customConversion(mylist, result_keys)
print "Result:"
for i in new_mylist:
print i
结果:
Result:
[('key001', 'US', None), ('key002', 'Central', 'key001'), ('key003', 'Louisiana', 'key002'), ('key004', 'Monroe', 'key003')]
[('key001', 'US', None), ('key002', 'Central', 'key001'), ('key005', 'Texas', 'key002'), ('key006', 'Midland', 'key005')]
[('key001', 'US', None), ('key007', 'Pacific', 'key001'), ('key008', 'California', 'key007'), ('key009', 'East Palo Alto', 'key008')]
[('key010', 'UK', None), ('key011', 'Coastside', 'key010'), ('key012', 'Sussex', 'key011'), ('key013', 'Brighton', 'key012')]
假设我们有一些分层数据,以列表的形式表示:
list = [
['US', 'Central', 'Louisiana', 'Monroe']
['US', 'Central', 'Texas', 'Midland']
['US', 'Pacific', 'California', 'East Palo Alto']
['UK', 'Coastside', 'Sussex', 'Brighton']
]
而且我们喜欢以树结构的形式向每个项目添加分层 ID,因此要实现这一点:
list = [
[(key1,'US',None), (key3,'Central',key1), (key6,'Louisiana',key3), (key10,'Monroe',key6)]
[(key1,'US',None), (key3,'Central',key1), (key7,'Texas',key3), (key11,'Midland',key7]
[(key1,'US',None), (key4,'Pacific',key1), (key8,'California',key4), (key12,'East Palo Alto',key8]
[(key2,'UK',None), (key5,'Coastside',key2), (key9,'Sussex',key5) (key13,'Brighton',key9]
]
这是否可以用一些优雅的 python 构造来实现?我在 Excel 开始手动执行此操作,但由于初始数据结构非常庞大,这似乎是一项永无止境的任务...
主要有两个任务:
- 为每个单词生成密钥。
- 从键和您的列表自定义转换。
密钥生成: 我使用简单的逻辑为每个单词生成密钥,我按每个项目迭代列表,并使用计数方法为项目中的每个单词生成唯一的密钥。
注意:您可以根据您的要求更改此逻辑。
自定义转换:现在我们有键和列表,生成列表的新项目,这里主键是为新项目的每个单词添加前一个键,所以使用pre_key
变量存储前一个单词的前一个键并将默认值设置为 None
。
演示:
输入:
mylist = [
['US', 'Central', 'Louisiana', 'Monroe'],
['US', 'Central', 'Texas', 'Midland'],
['US', 'Pacific', 'California', 'East Palo Alto'],
['UK', 'Coastside', 'Sussex', 'Brighton'],
]
代码:
def keyGenerator(mylist):
result_keys = {}
count = 1
for item in mylist:
for i in item:
if i not in result_keys:
result_keys[i] = "key%03d"%count
count += 1
return result_keys
def customConversion(mylist, result_keys):
new_mylist = []
for item in mylist:
new_item = []
pre_key = None
for i in item:
current_key = result_keys[i]
new_item.append((current_key, i, pre_key))
pre_key = current_key
new_mylist.append(new_item)
return new_mylist
mylist = [
['US', 'Central', 'Louisiana', 'Monroe'],
['US', 'Central', 'Texas', 'Midland'],
['US', 'Pacific', 'California', 'East Palo Alto'],
['UK', 'Coastside', 'Sussex', 'Brighton'],
]
#- Generate Key to each Word.
result_keys = keyGenerator(mylist)
# Custom Conversion
new_mylist = customConversion(mylist, result_keys)
print "Result:"
for i in new_mylist:
print i
结果:
Result:
[('key001', 'US', None), ('key002', 'Central', 'key001'), ('key003', 'Louisiana', 'key002'), ('key004', 'Monroe', 'key003')]
[('key001', 'US', None), ('key002', 'Central', 'key001'), ('key005', 'Texas', 'key002'), ('key006', 'Midland', 'key005')]
[('key001', 'US', None), ('key007', 'Pacific', 'key001'), ('key008', 'California', 'key007'), ('key009', 'East Palo Alto', 'key008')]
[('key010', 'UK', None), ('key011', 'Coastside', 'key010'), ('key012', 'Sussex', 'key011'), ('key013', 'Brighton', 'key012')]