iT邦幫忙

0

list 合併 但是規格不一

  • 分享至 

  • xImage

如題
我有三個list of list
一個list_tmp打算當作標籤用
list_tmp=['A','B','C','D','E','F','G']
a=[['A','1'],['B','2'],['C','3']]
b=[['A','5'],['C','2'],['D','1']]
c=[['C','1'],['E','2']]
我有嘗試過將有值得加進來
但是格式上會偏掉
我期望的結果是
如果a裡面有A則加入1 b裡面有A則加入5 c裡面沒有A則加入'-'
都沒有的話就比如F跟G就加入'-'
list_tmp2=[['A','1','5','-']
['B','2','-','-']
['C','3','2','1']
['D','-','1','-']
['E','-','-','2']
['F','-','-','-']
['G','-','-','-']]
求救大神 感謝

canrong iT邦新手 2 級 ‧ 2022-05-11 11:18:55 檢舉
是不是沒值的地方忘記補"-"?你的想法看起來本身沒問題,使用基本的巢狀迴圈即可完成你的需求。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
海綿寶寶
iT邦大神 1 級 ‧ 2022-05-11 08:37:12

我只會最基本的寫法
iterate over a list

https://ithelp.ithome.com.tw/upload/images/20220511/200017873N7fdaIv6x.png

win895564 iT邦研究生 5 級 ‧ 2022-05-11 09:05:49 檢舉

大大可以提供思路嗎

2
tempest0099
iT邦新手 5 級 ‧ 2022-05-11 13:01:05

最基本的巢狀迴圈

def main():
	list_tmp = ['A','B','C','D','E','F','G']
	a = [['A','1'],['B','2'],['C','3']]
	b = [['A','5'],['C','2'],['D','1']]
	c = [['C','1'],['E','2']]

	list_holder = [a, b, c]
	list_tmp2 = []

	for x in list_tmp:
		spec = [x]
		for y in list_holder:
			spec.append(checker(y, x))
		list_tmp2.append(spec)

	print(list_tmp2) 

def checker(arr, eng):
	for x in arr:
		if x[0] == eng:
			return x[1]
	return '-'

main()

win895564 iT邦研究生 5 級 ‧ 2022-05-11 17:37:53 檢舉

真的非常感謝
雖然我已經有解決了
不過 大大的程式碼又比我精簡多
/images/emoticon/emoticon02.gif

3
nitekat
iT邦新手 5 級 ‧ 2022-05-12 08:04:23
list_tmp = ["A", "B", "C", "D", "E", "F", "G"]
a = [["A", "1"], ["B", "2"], ["C", "3"]]
b = [["A", "5"], ["C", "2"], ["D", "1"]]
c = [["C", "1"], ["E", "2"]]

targets = [a, b, c]

list_tmp2 = [[i] + [t[keys.index(i)][1] if i in (keys := [v[0] for v in t]) else "-" for t in targets] for i in list_tmp]

print(list_tmp2)

這樣算 one-liner 嗎
不過因為有用到賦值表達式的關係,所以需要 python 3.8 以上

1
obarisk
iT邦研究生 1 級 ‧ 2022-05-12 13:55:01

假設標籤的字母是唯一。那得用 set。
資料的部份,如果要確保標籤是唯一,那得用 dict。

labels = set(['A', 'B', 'C', 'D', 'E', 'F'])

data_a = [['A','1'],['B','2'],['C','3']]
data_b = [['A','5'],['C','2'],['D','1']]
data_c = [['C','1'],['E','2']]

dicts = [dict(x) for x in [data_a, data_b, data_c]]

{l: [d.get(l) or '-' for d in dicts] for l in labels}

如果轉成 DataFrame,那用 merge 就可以搞定了。只是就得載入套件了。

我要發表回答

立即登入回答