首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python (Excel,字典)如何写得更短

Python (Excel,字典)如何写得更短
EN

Stack Overflow用户
提问于 2016-06-16 20:02:14
回答 1查看 117关注 0票数 0

我写了一个太长的程序,我相信我可以写得更短。

这是一个从Excel导出值的函数:

代码语言:javascript
复制
#"place" is a place where I have Excel file "book1.xlsx" 
place=os.path.join(DATA_DIR,'book1.xlsx')
Excel=win32com.client.Dispatch('Excel.Application')
wb=Excel.Workbooks.Open(place)
sheet=wb.ActiveSheet

#we are reading information from Excel
# I have a table in Excel. This table has a name "Table'
#TI3_value is a column in Table with name TI3 
#TI3_value is a list, for example, [4.97, 3.02,1.02] 
TI3_value=[r[0].value for r in sheet.Range("Table[TI3]")]

#TI4_value is a column in Table with name TI4
TI4_value=[r[0].value for r in sheet.Range("Table[TI4]")]
TI5_value=[r[0].value for r in sheet.Range("Table[TI5]")]

Frank_value=[r[0].value for r in sheet.Range("Table[Frank]")]
Shanh_value=[r[0].value for r in sheet.Range("Table[Shanh]")]
Manil_value=[r[0].value for r in sheet.Range("Table[Manil]")]

TI3_name=[r[0].value for r in sheet.Range("Table[TI3_name]")]
TI4_name=[r[0].value for r in sheet.Range("Table[TI4_name]")]
TI5_name=[r[0].value for r in sheet.Range("Table[TI4_name]")]

Frank_value=[r[0].value for r in sheet.Range("Table[Frank_name]")]
Shanh_value=[r[0].value for r in sheet.Range("Table[Shanh_name]")]
Manil_value=[r[0].value for r in sheet.Range("Table[Manil_name]")] 

TI3_name=[x for x in TI3_name if str(x)!='None'

正如您所看到的,这不是一个紧凑的代码。

我怎么写得更短?

我试着用字典..。

代码语言:javascript
复制
Heroes_name={'TI3_name':1,'TI4_name':2,'TI5_name':3,
             'Frank_name':4,'Shanh_name':5,'Manil_name':6}

for hero in Heroes_name:
    hero=[r[0].value for r in sheet.Range('Table[%s]' % hero)]

TI3_name=[x for x in TI3_name if str(x)!='None']

但我得到了以下错误:

代码语言:javascript
复制
local variable 'TI3_name' referenced before assignment

总之..。我如何写我的程序更短?

更新: Alexey Bogomolov写道:“不幸的是,对我来说还不清楚,你会有什么?”

我写了一个太长的程序,我相信我可以写得更短。我怎么能这么做?(这是一个完整的程序代码)

代码语言:javascript
复制
import os
import win32com.client
import numpy as np

from utils import DATA_DIR
def read_from_excel():
    place=os.path.join(DATA_DIR,'book1.xlsx')
    Excel=win32com.client.Dispatch('Excel.Application')
    wb=Excel.Workbooks.Open(place)
    sheet=wb.ActiveSheet


    TI3_name=[r[0].value for r in sheet.Range("Table[TI3_Name]")]

    TI4_name=[r[0].value for r in sheet.Range("Table[TI4_Name]")]
    TI5_name=[r[0].value for r in sheet.Range("Table[TI5_Name]")]
    Frank_name=[r[0].value for r in sheet.Range("Table[Frank_name]")]
    Shanh_name=[r[0].value for r in sheet.Range("Table[Shanh_name]")]
    Manil_name=[r[0].value for r in sheet.Range("Table[Manil_name]")]

    TI3_value=[r[0].value for r in sheet.Range("Table[TI3]")]

    TI4_value=[r[0].value for r in sheet.Range("Table[TI4]")]
    TI5_value=[r[0].value for r in sheet.Range("Table[TI5]")]

    Frank_value=[r[0].value for r in sheet.Range("Table[Frank]")]
    Shanh_value=[r[0].value for r in sheet.Range("Table[Shanh]")]
    Manil_value=[r[0].value for r in sheet.Range("Table[Manil]")]

    TI3_name=[x for x in TI3_name if str(x)!='None']
    TI4_name=[x for x in TI4_name if str(x)!='None']
    TI5_name=[x for x in TI5_name if str(x)!='None']

    Frank_name=[x for x in Frank_name if str(x)!='None']
    Shanh_name=[x for x in Shanh_name if str(x)!='None']
    Manil_name=[x for x in Manil_name if str(x)!='None']

    TI3_value=[x for x in TI3_value if str(x)!='None']
    TI4_value=[x for x in TI4_value if str(x)!='None']
    TI5_value=[x for x in TI5_value if str(x)!='None']

    Frank_value=[x for x in Frank_value if str(x)!='None']
    Shanh_value=[x for x in Shanh_value if str(x)!='None']
    Manil_value=[x for x in Manil_value if str(x)!='None']

    TI3=list(zip(TI3_name,TI3_value))
    TI4=list(zip(TI4_name, TI4_value))
    TI5=list(zip(TI5_name, TI5_value))

    Frank=list(zip(Frank_name, Frank_value))
    Shanh=list(zip(Shanh_name, Shanh_value))
    Manil=list(zip(Manil_name, Manil_value))

    TI3=np.array(TI3)
    TI4=np.array(TI4)
    TI5=np.array(TI5)

    Frank=np.array(Frank)
    Shanh=np.array(Shanh)
    Manil=np.array(Manil)

    return TI3, TI4, TI5, Frank, Shanh, Manil

def find_number_uniq_heroes(TI3, TI4, TI5, Frank, Shanh, Manil):
   x1=TI3[:,0]
   x2=TI4[:,0]
   x3=TI5[:,0]
   x4=Frank[:,0]
   x5=Shanh[:,0]
   x6=Manil[:,0]

   x=np.concatenate((x1,x2,x3,x4,x5,x6),0)
   y=np.unique(x)


   return y
def number_popular(x,y,hero):
    try:
        i=x.tolist().index(hero)
        return float(y[i])    
    except ValueError:
        return float(0)


def count_popularity(uniq_heroes,TI3, TI4, TI5, Frank, Shanh, Manil):

    n=len(uniq_heroes)
    popul=np.zeros(n)

    x1=TI3[:,0]
    x2=TI4[:,0]
    x3=TI5[:,0]
    x4=Frank[:,0]
    x5=Shanh[:,0]
    x6=Manil[:,0]

    y1=TI3[:,1]
    y2=TI4[:,1]
    y3=TI5[:,1]
    y4=Frank[:,1]
    y5=Shanh[:,1]
    y6=Manil[:,1]


    i=0
    for hero in uniq_heroes:

        pop=float(0)
        pop=number_popular(x1,y1,hero)
        pop=pop+number_popular(x2,y2,hero)
        pop=pop+number_popular(x3,y3,hero)
        pop=pop+number_popular(x4,y4,hero)
        pop=pop+number_popular(x5,y5,hero)
        pop=pop+number_popular(x6,y6,hero)

    popul[i]=float(pop)
    i=i+1


    return list(zip(uniq_heroes,popul))

def sort_mass(x):

    x=sorted(x,key=lambda x_entry:x_entry[1],reverse=True)

    return x


TI3, TI4, TI5, Frank, Shanh, Manil = read_from_excel()
uniq_heroes=find_number_uniq_heroes(TI3, TI4, TI5, Frank, Shanh, Manil)
un_her_with_popul=count_popularity(uniq_heroes,TI3, TI4, TI5, Frank, Shanh, Manil)
sorted_mas=sort_mass(un_her_with_popul)

print(sorted_mas[:10])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-16 23:51:44

由于没有安装Excel,所以我将您的文件转换为csv,并编写了一个简单的解析器,该解析器返回带有每个标题及其值的表头和字典。我希望,这是一个很好的起点,因为你可以用字典值做你想做的任何事情)

代码语言:javascript
复制
import csv


def return_column(rownubmer, delimiter_value):
    column = {}
    column_values = []   
    file = open('sheet1.csv')
    data = csv.reader(file, delimiter=delimiter_value)
    header = next(data)
    for row in data:
        try:
            column_values.append(row[rownubmer])
        except IndexError:
            pass
    column[header[rownubmer]] = column_values
    return column

n = return_column(0, ',')
m = return_column(1, ',')

print(n,m)

产出如下:

代码语言:javascript
复制
{'TI3_name': ['Batrider', 'Outworld Devourer', 'Lifestealer', 'Visage', 'Chen', 'Io', 'Alchemist', 'Dark Seer', 'Weaver', "Nature's Prophet", 'Dragon Knight', 'Naga Siren', 'Gyrocopter', 'Rubick', 'Nyx Assassin', 'Razor', 'Puck', 'Shadow Demon', 'Enchantress', 'Lone Druid', 'Bane', 'Keeper of the Light', 'Anti-Mage', 'Beastmaster', 'Treant Protector', 'Bounty Hunter', 'Timbersaw', 'Queen of Pain', 'Enigma', 'Storm Spirit', 'Clockwerk', 'Shadow Fiend', 'Vengeful Spirit', 'Jakiro', 'Magnus', 'Crystal Maiden', 'Tinker', 'Spectre', 'Windranger', 'Leshrac', 'Juggernaut', 'Sand King', 'Ursa', 'Doom', 'Chaos Knight', 'Earthshaker', 'Tidehunter', 'Mirana', 'Templar Assassin', 'Venomancer', 'Phantom Lancer', 'Morphling', 'Lina', 'Viper', 'Skywrath Mage', 'Silencer', 'Kunkka', 'Disruptor', 'Pudge', 'Lion', 'Axe', 'Ancient Apparition', 'Faceless Void', 'Luna', 'Lich', 'Clinkz', 'Undying', 'Sven', 'Spirit Breaker', 'Pugna', 'Omniknight', 'Slark', 'Dazzle', 'Meepo', 'Bloodseeker', 'Shadow Shaman', 'Slardar', 'Zeus', 'Wraith King', 'Bristleback', 'Tiny', 'Invoker', 'Broodmother', 'Ogre Magi', 'Night Stalker', 'Warlock', 'Sniper', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']} {'TI3': ['4.97', '4.69', '4.66', '4.63', '4.32', '4.14', '4.07', '4.07', '3.77', '3.4', '3.3', '3.12', '2.9', '2.84', '2.41', '2.31', '2.31', '2.04', '1.98', '1.88', '1.82', '1.54', '1.54', '1.42', '1.42', '1.36', '1.3', '1.2', '1.17', '1.14', '1.11', '1.08', '1.05', '1.05', '0.93', '0.86', '0.86', '0.74', '0.68', '0.68', '0.62', '0.62', '0.59', '0.56', '0.52', '0.49', '0.46', '0.46', '0.43', '0.37', '0.37', '0.37', '0.34', '0.28', '0.22', '0.19', '0.15', '0.15', '0.15', '0.12', '0.12', '0.12', '0.12', '0.12', '0.12', '0.09', '0.09', '0.09', '0.06', '0.06', '0.06', '0.06', '0.06', '0.06', '0.06', '0.06', '0.06', '0.03', '0.03', '0.03', '0.03', '0.03', '0.03', '0.03', '0.03', '0.03', '0.03', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']}

如果遇到IndexError异常,可以将for-循环更改为如下所示:

代码语言:javascript
复制
for row in data:
    try:
        lis.append(row[rownubmer])
    except IndexError:
        pass

但实际上剧本应该能用..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37868413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档