我在文本文件中有许多记录,代表'月'1-30的天数以及商店是开放还是关闭。这些信件代表了商店。
A 00000000001000000000000000000
B 11000000000000000000000000000
C 00000000000000000000000000000
D 00000000000000000000000000000
E 00000000000000000000000000000
F 00000000000000000000000000000
G 00000000000000000000000000000
H 00000000000000000000000000000
I 11101111110111111011111101111
J 11111111111111111111111111111
K 00110000011000001100000110000
L 00010000001000000100000010000
M 00100000010000001000000100000
N 00000000000000000000000000000
O 11011111101111110111111011111
我想将1和0存储在一个数组中(我正在考虑numpy,但还有另一种方式(string,bitstring)我会很满意)。然后我希望能够切片一天,即一列,并将记录键放回一组。
e.g。
A 1
B 0
C 0
D 0
E 0
F 0
G 0
H 0
I 0
J 1
K 1
L 1
M 0
N 0
O 1
day10 = {A,J,K,L,O}
我也需要这样做尽可能高效。
答案 0 :(得分:3)
我想出的最简单的解决方案:
shops = {}
with open('input.txt', 'r') as f:
for line in f:
name, month = line.strip().split()
shops[name] = [d == '1' for d in month]
dayIndex = 14
result = [s for s,v in shops.iteritems() if v[dayIndex]]
print "Shops opened at",dayIndex,":",result
答案 1 :(得分:2)
一个笨拙的解决方案:
stores, isopen = np.genfromtxt('input.txt', dtype="S30", unpack=True)
isopen = np.array(map(list, isopen)).astype(bool)
然后,
>>> stores[isopen[:,10]]
array(['A', 'J', 'K', 'L', 'O'],
dtype='|S30')
答案 2 :(得分:1)
with open("datafile") as fin:
D = {i[0]:int(i[:1:-1], 2) for i in fin}
days = [{k for k in D if D[k] & 1<<i} for i in range(31)]
只需在查询之间保留days
变量
答案 3 :(得分:1)
首先,我会毫不犹豫地编写代码量,以便为bitarray提供帮助。
其次,我已经提出了BartoszKP的答案,因为它看起来是一种合理的方法。
最后,我会使用pandas而不是numpy来执行这样的任务,因为对于大多数任务来说,它将使用底层的numpy函数并且合理快速。
如果data
包含您的数组作为字符串,则可以使用
>>> df = pd.DataFrame([[x] + map(int, y)
... for x, y in [l.split() for l in data.splitlines()]])
>>> df.columns = ['Shop'] + map(str, range(1, 30))
并使用
完成查找>>> df[df['3']==1]['Shop']
8 I
9 J
10 K
12 M
Name: Shop, dtype: object
答案 4 :(得分:0)
使用多层字典:
all_shops = { 'shopA': { 1: True, 2: False, 3: True ...},
.......}
然后您的查询被翻译为
def query(shop_name, day):
return all_shops[shop_name][day]
答案 5 :(得分:0)
with open("datafile") as f:
for line in f:
shop, _days = line.split()
for i,d in enumerate(_days):
if d == '1':
days[i].add(shop)
更简单,更快速并回答问题