#! /usr/bin/env python

# Copyright 2020 John Hanley.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# The software is provided "AS IS", without warranty of any kind, express or
# implied, including but not limited to the warranties of merchantability,
# fitness for a particular purpose and noninfringement. In no event shall
# the authors or copyright holders be liable for any claim, damages or
# other liability, whether in an action of contract, tort or otherwise,
# arising from, out of or in connection with the software or the use or
# other dealings in the software.

import pandas as pd


# https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/IG0UN2
# https://dataverse.harvard.edu/api/access/datafile/3814252?format=original&gbrecs=true

def _get_num_districts(in_file='/tmp/1976-2018-house2.csv'):
    df = pd.read_csv(in_file, encoding='latin-1')
    df = df[(df.year == 2018) & (df.district >= 0) & ~df.writein]
    df = df[['state_po', 'district', 'candidate', 'party', 'candidatevotes']]
    df = df.rename(columns={'state_po': 'state'})
    df = df[['state', 'district']]
    df = df.drop_duplicates(['state', 'district'])
    return df.append([dict(state='DC', district=42)])


def main():
    df = _get_num_districts().groupby('state').agg('count').rename(columns={
        'district': 'electors'})
    df.electors += 2
    print(df)


if __name__ == '__main__':
    main()

@@ -1745,20 +1745,33 @@
 )%0A%0A%0Adef 
-main
+_get_num_electors
 ():%0A    
@@ -1825,16 +1825,28 @@
 'count')
+%0A    df = df
 .rename(
@@ -1858,17 +1858,8 @@
 ns=%7B
-%0A        
 'dis
@@ -1908,16 +1908,335 @@
     
-print(df
+return df%0A%0A%0Adef find_ties(target=269):%0A    xs = sorted(_get_num_electors().electors, reverse=True)%0A    assert 51 == len(xs)%0A    assert 2 * target == sum(xs)%0A%0A    # greedy%0A    s1 = s2 = 0%0A    for x in xs:%0A        if s1 %3C= s2:%0A            s1 += x%0A        else:%0A            s2 += x%0A        if s1 == s2:%0A            print(s1, s2, x
 )%0A%0A%0A
@@ -2266,15 +2266,20 @@
 _':%0A    
-main
+find_ties
 ()%0A

Add find_ties