iT邦幫忙

0

Python dic數值讀取加總問題

  • 分享至 

  • xImage

想問若輸入為n(可決定要輸入多少)
https://ithelp.ithome.com.tw/upload/images/20230524/201569481YttoHiwB6.png
這邊也分享一下其他解決方法
總體來說就是
n為總輸入總數(假設為3)
a 1 b b (假設輸入a 而其合成值會是1+b+b=5)
b 2 (假設b為2=2)
c 2 b (假設c為b+2=4)
output:
5
2
4

n=int(input())
s=[input().split() for _ in range(n)]
d={}
c=0
while len(d)<n:
    i=c%n
    try:
        sm=sum([int(e) for e in s[i][1:]])
        d[s[i][0]]=sm
    except:
        for k in d:
            if k in s[i]:
                x=s[i].index(k)
                s[i][x]=str(d[k])
    c+=1
froce iT邦大師 1 級 ‧ 2023-05-24 08:34:59 檢舉
我覺得該編的是你的表達能力,我看了三遍還是看不懂你的問題。
ccutmis iT邦高手 2 級 ‧ 2023-05-24 09:21:22 檢舉
@froce : 感覺這好像是學校作業,例如讓使用者輸入n ,然後跑 n次的廻圈,每次輸入一個字串,例如用空格分隔出四個成績"80 70 60 90" 然後加總出總分...XD 不過它在n次廻圈裡要做啥我也看不懂
noe1206L iT邦新手 5 級 ‧ 2023-05-25 11:25:48 檢舉
謝謝 那時太急著打,下次會注意文章內文!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
re.Zero
iT邦研究生 5 級 ‧ 2023-05-24 23:33:36
最佳解答

你這個……

https://ithelp.ithome.com.tw/upload/images/20230524/201569481YttoHiwB6.png

是類似多元一次聯立方程式的概念?
( 因為你說明的不清不楚, 你的欄位標題我也看不懂, 所以我用猜的~ )

A=1+B+D  # A==16
B=2+E    # B==11
C=3      # C==3
D=4      # D==4
E=5+D    # E==9

表格化…… 像這樣?:
( 還是上面聯立方程式的寫法我才看得懂, 這表格好像還是讓人看不明瞭…… )

變數名 = 加數(值) 加數(名) 加數(名) # 變數解答
A = 1 B D # A==16
B = 2 E # B==11
C = 3 # C==3
D = 4 # D==4
E = 5 D # E==9

瞎扯就到這裡吧~ 以下給你個參考:

  • 因為看起來像是聯立方程式, 我就用 NumPylinalg.solve() 來求解了。
    ( 如果你就是想要求解的細節, 請另等高明 (就是不要把我的文設為解答), 我現在懶得搞那些~ )
  • 因為我想用 linalg.solve() , 所以你程式碼 product={} 之後的我就不管了~
    ( 因為我看得懂你在做啥(大概), 但是想不懂你那樣規劃「之後」想做啥~ )
  • 因為是想到啥就寫啥的隨意作品, 有一堆疑慮的程式碼內容請視情境或需求等自行修改。
## Tested @[Python 3.10.9];
def myMain():
	""" myMain#1 """
	## n: 輸入項目數量; 
	n = int(input('n(int): '))
	## s: 輸入「項目名稱」([0])與「項目內容」([1:]); 
	s = [input(f'[{_}](str): ').split() for _ in range(n)]
	""" 
## 遍歷 s 內各 list 的元素: 
## - 若元素字串符合浮點數格式, 將該元素轉為浮點數; 
## - 若元素字串不符合浮點數格式, 將該元素紀錄於使用到的變數名稱之集合(mySetVN); 
"""
	mySetVN = set()
	for i in s:
		for idx, ele in enumerate(i):
			if ele.replace('.','',1).isdigit():
				i[idx] = float(ele)
			else:
				mySetVN |= set((i[idx],))
	## 整理排序後的變數名稱集合給 myListVN;
	myListVN = sorted(mySetVN)
	""" ## 建立給 NumPy 處理的聯立方程式(方程組)之資料; """
	import numpy as np
	## myEqsAryA: list for 方程組A;
	myEqsAryA = list()
	for i in s:
		## aEqAry: list for 單個方程式;
		aEqAry = [0] *len(myListVN)
		for idx, ele in enumerate(myListVN):
			"""
## 把例如 `A=1+B` 的型式整理成 `A-B=1` 型式。 
"""
			if ele in i:
				if i.index(ele): ## i.index(ele) != 0:
					aEqAry[idx] = -1
				else: ## i.index(ele) == 0:
					aEqAry[idx] = 1
		myEqsAryA.append(aEqAry)
	## 把 myEqsAryA 轉成給 NumPy 用的係數矩陣;
	myEqsNPAryA = np.array(myEqsAryA)
	## 把 s 內各 list 的第二個元素 ([1]) 轉成給 NumPy 用的常數矩陣;
	myEqsNPAryB = np.array([i[1] for i in s])
	## 用 NumPy 的 linalg.solve() 求解;
	myEqsNPAryX = np.linalg.solve(myEqsNPAryA, myEqsNPAryB)
	## 將相對應的變數名稱與數值轉成 dict;
	myResult = dict(zip(myListVN, myEqsNPAryX))
	## 
	print('Result: ')
	print(myResult)
	return
## 
if __name__ == '__main__' :
	myMain()
## 

另,我這邊的結果:

n(int): 5
[0](str): A 1 B D
[1](str): B 2 E
[2](str): C 3
[3](str): D 4
[4](str): E 5 D
Result:
{'A': 16.0, 'B': 11.0, 'C': 3.0, 'D': 4.0, 'E': 9.0}
noe1206L iT邦新手 5 級 ‧ 2023-05-25 11:26:15 檢舉

謝謝大大!!!

sam0407 iT邦大師 1 級 ‧ 2023-05-25 11:30:15 檢舉

超強~~我覺得您也懂通靈!!

noe1206L iT邦新手 5 級 ‧ 2023-06-02 16:13:20 檢舉

@sam0407 謝謝sam大!

1
alien663
iT邦研究生 4 級 ‧ 2023-05-24 08:53:36

你的範例輸入應該是打錯了,沒給值怎樣計算。

n = 4
data = [{"A":1, "B":24, "C":0,"D":0}, {"B":2, "C": 11, "D":0}, {"C":3, "D": 4}, {"D": 4}]
for i in range(n):
    temp = 0
    for item in data[i]:
        temp += data[i][item]
    print(temp)
noe1206L iT邦新手 5 級 ‧ 2023-05-25 11:25:30 檢舉

謝謝!

我要發表回答

立即登入回答