Py学习  »  Mark Meyer  »  全部回复
回复总数  12
5 年前
回复了 Mark Meyer 创建的主题 » Python:创建一个字典,其中键有多个值

你可以用 setdefault()

L=[('a','111'),('b','222'),('a','333'),('b','444')]

d = {}
for key, value in L:
    d.setdefault(key, []).append(value)

print(d)
# {'a': ['111', '333'], 'b': ['222', '444']}
5 年前
回复了 Mark Meyer 创建的主题 » Python:将二进制字符串转换为文本文件

你需要一些识别字符边界的方法。如果将其限制为设置的位长度(如仅8位),则可以填充二进制文件,然后就可以知道字符大小。如果你不想这样做,你需要别的办法。

这里有一个方法,它不关心处理空格、emojis等的输入。它是通过用空格分隔二进制文件中的字符来实现的:

test_str = "Dies ist eine binäre Übersetzung. 🐻"

Binary = ' '.join(format(ord(i), 'b') for i in test_str)   

print("original:")
print(test_str)

print("\nThe string after Binary conversion : \n" + Binary)

text = "".join(chr(int(s, 2)) for s in  Binary.split())
print(f'\nString after conversion back to text:\n{text}')

这张照片:

原件:
死在一个垃圾桶里。

二进制转换后的字符串:
1000100 1101001 1100101 1110011 100000 1101001 1110011 1110100 100000 1100101 1101001 1101110 1100101 100000 1100010 1101001 1101110 11100100 1110010 1100101 100000 1110101 1101110 1100111 101110 100000 11111 01000011011

转换回文本后的字符串:
死在一个垃圾桶里。

注意emoji的最后一个字符以及二进制文件的长度。可能是bear emoji或几个ascii字符。没有分隔符,现在就有办法知道了。

5 年前
回复了 Mark Meyer 创建的主题 » 第一次出现在Python中的重复字符

像这样做的一种蟒蛇式的方法是 zip() (1, 2), (2, 3) ... 然后返回第一个值,其中两个值都是相等的,并且都是字母数字。

next() 获取一个可选参数,用于在没有剩余内容时返回什么内容,在这里可以传递给 -1 isalnum() 可用于测试的字符串是字母数字的:

def firstRepeatedChar(s):
    return next((j for j, i in zip(s, s[1:]) if j == i and j.isalnum()), -1)

firstRepeatedChar("..12345678910111213141516171820212223")
# 1
firstRepeatedChar("^^cmmit^^")
# 'm'
firstRepeatedChar("^^cmit^^")
# -1
5 年前
回复了 Mark Meyer 创建的主题 » 如何将以下Python字符串拆分为字符串列表?

你可以用 re.split() 拆开你的绳子 ( ) . 您可以捕获regex中的分隔符,以便在最终输出中包含它们。结合 str.strip()

import re

s = 'Predicate ( big ,small )'
[s.strip() for s in  re.split(r'([\(\),])', s.strip()) if s]
# ['Predicate', '(', 'big', ',', 'small', ')']
5 年前
回复了 Mark Meyer 创建的主题 » python对象的自定义过滤函数

既然你在考虑一套,我想原来的顺序并不重要。如果是这样,一个选项是添加 __lt__ 方法,以便可以按分数比较对象。然后按相反的顺序对元组进行排序,按整数分组,并从每个组中获取第一个项。在代码中比解释更容易看到:

from itertools import groupby

class myObject:
    def __init__(self, score):
        self.score = score
    def __repr__(self):
        return f'<Object {self.score}>'
    def __lt__(self, other):
        return self.score < other.score

pairs = [(1, myObject(1)), (1, myObject(1)), (3, myObject(7)), (9, myObject(3)), (9, myObject(4))]

[next(v) for k, v in groupby(sorted(pairs, reverse=True), key=lambda x: x[0])]

结果

[(9, <Object 4>), (3, <Object 7>), (1, <Object 1>)]
5 年前
回复了 Mark Meyer 创建的主题 » 如何根据python中的数字列表生成数量?

我认为这是一个生成器,可以根据需要生成扁平化的值。类似于:

list1=[2,1,3]

def expandIndices(l):
    for i, n in enumerate(l,1):
        yield from [i] * n

list(expandIndices(list1))
# [1, 1, 2, 3, 3, 3]
5 年前
回复了 Mark Meyer 创建的主题 » 在Python中读取协议缓冲文件

Protobuffer是一种二进制格式,因此在原始状态下是不可读的。要读它,去拿 python bindings from Google 安装时使用:

pip install --upgrade gtfs-realtime-bindings

from google.transit import gtfs_realtime_pb2
import urllib.request 

feed = gtfs_realtime_pb2.FeedMessage()
pb_url = "http://someURL/someFile.pb"

with urllib.request.urlopen(pb_url) as response:
    feed.ParseFromString(response.read())
    print(feed)

这会给你类似的东西:

header {
  gtfs_realtime_version: "1.0"
  incrementality: FULL_DATASET
  timestamp: 1579313685
}
entity {
  id: "10-abc-O-1"
  trip_update {
    trip {
      trip_id: "10-1622-O-1"
    }
...
5 年前
回复了 Mark Meyer 创建的主题 » Python:转换深度嵌套字典或数组中的类型

我认为如果将转换放在开头,允许递归调用传递 ObjectId 并将转换后的字符串直接与函数一起返回,而不是尝试在函数的循环内进行转换。然后您可以将该值传递到递归中,并将字符串取回。

类似于:

from datetime import datetime

def clean_dict_helper(d):
    if isinstance(d, ObjectId) or isinstance(d, datetime):
        return str(d)

    if isinstance(d, list):  # For those db functions which return list
        return [clean_dict_helper(x) for x in d]

    if isinstance(d, dict):
        for k, v in d.items():
            d.update({k: clean_dict_helper(v)})

    # return anything else, like a string or number
    return d

打电话:

clean_dict_helper({
    1: {
        1: ObjectId('5e0e83a6d0fbe7238c960ea0'),
        2: [ObjectId('5e0e83a6d0fbe7238c960ea0'), ObjectId('5e0e83a6d0fbe7238c960ea0')],
        3: datetime(2020, 1, 1),
        4: [{1: ObjectId('5e0e83a6d0fbe7238c960ea0')}],
        5: 'test'
    },
    2: [ObjectId('5e0e83a6d0fbe7238c960ea0'), ObjectId('5e0e83a6d0fbe7238c960ea0')]
})

然后将返回:

{1: {1: '5e0e83a6d0fbe7238c960ea0',
  2: ['5e0e83a6d0fbe7238c960ea0', '5e0e83a6d0fbe7238c960ea0'],
  3: '2020-01-01 00:00:00',
  4: [{1: '5e0e83a6d0fbe7238c960ea0'}],
  5: 'test'},
 2: ['5e0e83a6d0fbe7238c960ea0', '5e0e83a6d0fbe7238c960ea0']}

另外,由于您正在创建一个具有理解力的新列表,因此返回一个新的dict可能是有意义的,而不是用如下内容对传入值进行变异:

    if isinstance(d, dict):
        return {k:clean_dict_helper(v) for k, v in d.items() }
6 年前
回复了 Mark Meyer 创建的主题 » 用于在值小于输入值时打印库存的python字典

您需要返回一个列表,以便可以从定义一个列表开始。类似于:

low_inv = []

在你的圈子里 append() 如果库存不足,则该列表的键(在本例中是计算机的名称)。然后返回:

d = {"MS Surface":47, "HP Laptop Probook":144, "MacBook Pro":23, "Dell Laptop XPS": 10, "Asus Chromebook": 20}

def total_items(laptop_dict, threshold):
    low_inv = []                           # new list
    for akey in laptop_dict.keys():
        if laptop_dict[akey] < threshold:
            low_inv.append(akey)           # append to it
    return low_inv                         # return it

total_items(d,47)

#['MacBook Pro', 'Dell Laptop XPS', 'Asus Chromebook']

这也可以作为 list comprehension ,它将一次性创建一个列表,而不使用显式循环:

def total_items(laptop_dict, threshold):
    return [akey for akey, inv in laptop_dict.items() if inv < threshold]
6 年前
回复了 Mark Meyer 创建的主题 » 如何在python中对相似序列进行分组?[副本]

我想 itertool.groupby

from itertools import groupby

inp = ['a','a', 'i', 'e', 'e', 'e', 'i', 'i', 'a', 'a'] 

output = [list(g) for k,g in groupby(inp)]
print(output)

印刷品

[['a', 'a'], ['i'], ['e', 'e', 'e'], ['i', 'i'], ['a', 'a']]

def group_seq(listA):
    prev = None
    cur = None
    ret = []

    for l in listA:
        if l == prev:    # assumes list doesn't contain None
            cur.append(l)
        else:
            cur = [l]
            ret.append(cur)
        prev = l

    return ret  
6 年前
回复了 Mark Meyer 创建的主题 » 如何在python中每x次迭代直到无穷大?

你不需要一直增加 i 你只需要一遍又一遍地数到7。所以重新设置 当它击中你的计数时归零。那么你就不需要除法也不需要大量:

i = 0
while true:     
    # Do some other stuff first.
    # Check if this iteration is after 7.
    i += 1
    if i == 7:
        print('Factor of 7')
        i = 0 # reset

如果你使用 re.sub() match itertools.count()

import re
from itertools import count

button_number_count = 1;
htmlString = "this is sometext with more sometext and yet another sometext"

counter = count(button_number_count)

// replace sometext with sometext1, sometext2...
new_string = re.sub(r'sometext', lambda x: x.group(0) + str(next(counter)), htmlString )

'this is sometext1 with more sometext2 and yet another sometext3'