什么是使用键和多个值来改变字典以获得所需输出的Pythonic方法?

Thi*_*ode 4 python mysql dictionary list

手头的问题:

我有以下列表的元组(ID,国家),我将最终存储在MySQL表中.

mylist = [(10, 'Other'), (10, 'India'), (10, 'Unknown'), (11, 'Other'), (11, 'Unknown'), (12, 'USA'), (12, 'UK'), (12, 'Other')]
Run Code Online (Sandbox Code Playgroud)

我想使用以下条件处理'其他'和'未知':

Value       Replaced by => This value
----------------------------------------
Other & Unknown         => Other
A country & Other       => Country
A country & Unknown     => Country
Run Code Online (Sandbox Code Playgroud)

Python:

def refinelist(mylist):

    '''Updating the list to remove unwanted values'''
    '''
    Other & Unknown => Other
    A country & Other => Country
    A country & Unknown => Country
    '''

    if 'Other' in mylist and 'Unknown' in mylist:
        print 'remove unknown'
        mylist.remove('Unknown')
    if 'Other' in mylist and len(mylist) >= 2:
        print 'remove other'
        mylist.remove('Other')
    if 'Unknown' in mylist and len(mylist) >= 2:
        print 'remove unknown'
        mylist.remove('Unknown')

    return mylist

def main():

    mylist = [(10, 'Other'), (10, 'India'), (10, 'Unknown'), (11, 'Other'), (11, 'Unknown'), (12, 'USA'), (12, 'UK'), (12, 'Other')]

    d = {}

    for x,y in mylist:
        d.setdefault(x, []).append(y)

    # Clean the list values    
    for each in d:
        d[each] = refinelist(d[each])

    ## Convert dict to list of tuples for database entry

    outlist = []

    #result = [(key, value) for key,value in d.keys(), value in d.values()]  ## Couldn't get this to work. Can the below loop be written as list comprehension with minimal footprint?

    for key, value in d.items():
        if len(value) == 1:
            print key, value[0]
            outlist.append((key, value[0]))
        elif len(value) > 1:
            for eachval in value:
                print key, eachval
                outlist.append((key, eachval))

    print outlist

if __name__ == "__main__":
    main()    
Run Code Online (Sandbox Code Playgroud)

输出:

remove unknown
remove other
remove unknown
remove other
10 India
11 Other
12 USA
12 UK
[(10, 'India'), (11, 'Other'), (12, 'USA'), (12, 'UK')]
Run Code Online (Sandbox Code Playgroud)

题 :

我觉得这可以更有效地完成.使用dict overkill?

我从一个元组(luples)列表开始,将它转换为dict,执行一个干净的操作,然后将其转换回luples?

我可以在MySQL表中插入原始的luples,然后用很少的查询来处理'Unknown'和'Other',但我更喜欢Python来完成任务.

非常感谢pythonic解决方案或代码的一些批评者.

MvG*_*MvG 6

广泛使用生成器和列表理解,你可以像这样写:

other = ['Other', 'Unknown']                        # Strings denoting non-contries
ids = set(i for i,j in mylist)                      # All ids in the list
known = set(i for i,j in mylist if j not in other)  # Ids of real countries
outlist = [k for k in mylist if k[1] not in other]  # Keep all real countries
outlist.extend((i, other[0]) for i in ids - known)  # Append "Other" for all IDs with no real country
Run Code Online (Sandbox Code Playgroud)

结果将是

[(10, 'India'), (12, 'USA'), (12, 'UK'), (11, 'Other')]
Run Code Online (Sandbox Code Playgroud)

如果订单很重要,这将意味着更多的工作.