python list和 php中 array區別

python 代碼:
#!/usr/bin/python
data = [5,10,5,10,1]
#data = [5,8,13,27,14]
dataLen = len(data)
'''data.sort()'''
if dataLen==1:
    print data[0]
listDiff = []
for i in range(dataLen-1,-1,-1):
    leftList = [data[i]]
    rightList = data[:]
    del rightList[i]
    for y in range(dataLen-2,-1,-1):
        if rightList[y]:
            addItem = rightList[y]
            #print addItem
            #print addItem
            leftSum = sum(leftList)
            rightSum = sum(rightList)
            if leftSum+2*addItem<=rightSum:
                leftList.append(addItem)
                del rightList[y]
    #print leftList
    leftSum = sum(leftList)
    rightSum = sum(rightList)
    listDiff.append(abs(leftSum-rightSum))
listDiff.sort()
result = listDiff[0]
#replace this for solution
print result

php代碼:

$array = array(5,10,5,10,1);
//$array = array(5,8,13,27,14);
$len = count($array);
$leftArray = array();
$rightArray = array();
for($i=$len-1;$i>=0;$i--){
	$leftArray = array($array[$i]);
	$rightArray = $array;
	unset($rightArray[$i]);
	for($y=$len-2;$y>=0;$y--){
		$addItem = $rightArray[$y];
		echo $addItem;
		echo '<br />';
		$leftSum = array_sum($leftArray);
		$rightSum = array_sum($rightArray);
		if($leftSum+2*$addItem<=$rightSum){
			$leftArray[] = $addItem;
			unset($rightArray[$y]);
		}
		print_r($rightArray);
	}
	//print_r($leftArray);
	$leftSum = array_sum($leftArray);
	$rightSum = array_sum($rightArray);
	$sumDiff[] = abs($leftSum-$rightSum);
}
sort($sumDiff);
echo $sumDiff[0];

我以爲這兩段代碼意思是一樣的,看來還是對python瞭解不夠深入。

其實最主要的差別就在:

python: 

del rightList[i]
php:
unset($rightArray[$i]);

python 的list可以用 0,1,2,3這些索引去訪問元素的,只是del(不論哪個)過後 list的索引還是從0開始的 0,1,2

php的 array unset 過後實際還會保持之前的索引關係   0,1,2,3  unset($array[2]) 後 是 0,1,3

所以上面如果修改成一下  保持索引 就把  rightList[i] 賦值爲 0


------------------------------------------------------------


(PS:上面的程序是把 list 分成二個 list  使他們兩的差最小。)【更好的解決是:】

def checkio(data):
    sd = sum(data)      # all sum
    std = sorted(data)  # sort items
    sm = chk(sd/2,std)  # find the biggest value
    return sd-sm-sm     # find the max_half-min_half

# 0-1 knapsack solution
def chk(v,s):           # value, item
    if len(s)==0 or v<s[0]: # no item or the smallest cannot be put into bag
        return 0
    else:               # some can be put into bag
        pv = []
        for i in range(len(s)):
            if s[i]<=v:
                cv = max(s[i]+chk(v-s[i],s[:i]+s[i+1:]),chk(v,s[:i]+s[i+1:]))
                pv.append(cv)
        if not pv:
            return 0
        else:
            return max(pv)

此解決方案引自 : http://bbs.csdn.net/topics/390507106#post-394946071  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章