社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Tim Roberts  »  全部回复
回复总数  21
3 年前
回复了 Tim Roberts 创建的主题 » Python Crontab无法读取Sqlite3表

如果这是您的本地用户crontab,那么当脚本运行时,当前目录将设置为您的主目录, /home/eric .你可能做了类似的事情 sqlite3.connect('quotebot.db') 。该文件不存在,sqlite3很乐意为您创建一个新的空数据库。

如果您需要家庭以外的文件,则必须使用绝对路径,或者使用 os.path.dirname(__file__) .

3 年前
回复了 Tim Roberts 创建的主题 » 特定格式的Python字典输出列表

分两个阶段进行。使用字典建立唯一列表,然后转换为字典列表:

from collections import defaultdict

vpcs = [{'ResourceOwnerId': '111111111111', 'ResourceType': 'vpc', 'ResourceId': 'vpc-aaaaa'},
        {'ResourceOwnerId': '222222222222', 'ResourceType': 'vpc', 'ResourceId': 'vpc-ccccc'},
        {'ResourceOwnerId': '111111111111', 'ResourceType': 'vpc', 'ResourceId': 'vpc-ddddd'}]

accum = defaultdict(list)
for vpc in vpcs:
    accum[vpc['ResourceOwnerId']].append( vpc['ResourceId'] )

print(accum)

acc_list = []
for k, v in accum.items():
    acc_list.append(
        {
            "account_number": k,
            "vpc": v
        }
    )

print(acc_list)

输出:

defaultdict(<class 'list'>, {'111111111111': ['vpc-aaaaa', 'vpc-ddddd'], '222222222222': ['vpc-ccccc']})
[{'account_number': '111111111111', 'vpc': ['vpc-aaaaa', 'vpc-ddddd']}, {'account_number': '222222222222', 'vpc': ['vpc-ccccc']}]

或者,对于那些喜欢一句台词的人:

...
acc_list = [ { "account_number": k, "vpc": v } for k, v in accum.items()]
print(acc_list)
3 年前
回复了 Tim Roberts 创建的主题 » Python对变量的重新声明在内部是如何工作的?

在第二行中,Python对赋值语句的右侧求值,这将创建一个使用旧绑定的字符串 greeting .只有在对该表达式求值之后,它才会处理赋值运算符,该运算符将该字符串绑定到名称。这都是线性的。

浮点数和整数也是不可变的。只有列表和字典是可变的。实际上,目前还不清楚在任何情况下如何修改integer对象。你指不到物体的内部。重要的是要记住,在这种情况下:

i = 3
j = 4
i = i + j

最后一行只是创建一个新的整数/浮点对象并将其绑定到 i 。所有这些都不会试图修改integer对象 3 .

我写了这篇文章,试图描述Python对象和我们使用的名称之间的区别:

https://github.com/timrprobocom/documents/blob/main/UnderstandingPythonObjects.md

3 年前
回复了 Tim Roberts 创建的主题 » 在python中使用For循环重复程序

你的循环只是在第一个随机数上循环,这绝对不是你想要的。你需要一个“永远”的循环,当用户想要停止时它就会退出。请注意,您需要在该循环中分配数字。还请注意,您不需要转换为字符串。

import random 
print('Python Slot Machine')

while True:
    random_num1 = random.randint(0,2)
    random_num2 = random.randint(0,2)
    random_num3 = random.randint(0,2)

    print(random_num1, random_num2, random_num3)
    if random_num1 == random_num2 == random_num3:
        print('You matched 3!')
    elif random_num1 == random_num2 or random_num1 == random_num3 or random_num2 == random_num3:
        print('You matched 2!')
    else:
        print('You lost')

    if input("Go again?  y/n: ") == "n":
        break
3 年前
回复了 Tim Roberts 创建的主题 » 在Python中使用str.lower时如何防止NaN?

只需先将列转换为字符串:

import pandas as pd
df = pd.DataFrame({'col':['G5051', 'G5052', 5053, 'G5054']})
print(df['col'].astype(str).str.lower())
3 年前
回复了 Tim Roberts 创建的主题 » Python阅读了一系列妄想中的妄想的第一个条目

这里有一个更好的方法。

import ast
s = ast.literal_eval(s)
entries = [a[0] for a in s]
3 年前
回复了 Tim Roberts 创建的主题 » Python Connect Four:在获取列表中列表的两个索引时遇到问题

看看这是否为您提供了一个关于如何通过2D数组进行枚举的提示,如下所示:

for y,row in enumerate(connect_four):
  for x,item in enumerate(row):
    print( f"The contents of {y},{x} is {item}." )

记住这一点 index 返回该行中第一个匹配项的索引。在这种情况下,这几乎永远不会是你想要的。

你根本不需要解析日期和时间。它们只是线。 考虑这个解决方案:

import json 

data = """\
22-10-2018,01:00:00,7.6,Station1
22-10-2018,01:15:00,9.0,Station1
22-10-2018,01:30:00,6.3,Station1
22-10-2018,01:45:00,4.1,Station1
22-10-2018,02:00:00,4.5,Station1
22-10-2018,02:15:00,7.3,Station1
22-10-2018,02:30:00,6.1,Station1
23-10-2018,01:30:00,6.3,Station2
23-10-2018,01:45:00,4.1,Station2
23-10-2018,02:00:00,4.5,Station2
23-10-2018,02:15:00,7.3,Station2
23-10-2018,02:30:00,6.1,Station2""".splitlines()

outdata = []
anydata = {}
lastkey = None
for line in data:
    date,time,temp,stn = line.split(',')
    if (stn,date) != lastkey:
        if anydata:
            outdata.append(anydata)
        lastkey = stn,date
        anydata = { "Station": stn, "Date": date, "Temps": [] }
    anydata["Temps"].append( (time,float(temp)) )
outdata.append(anydata)

print(json.dumps(outdata))

这将为每个站/日期组合生成一个元素,该组合包含时间/温度组合列表:

timr@tims-gram:~/src$ python x.py | jq .
[
  {
    "Station": "Station1",
    "Date": "22-10-2018",
    "Temps": [
      [
        "01:00:00",
        7.6
      ],
      [
        "01:15:00",
        9
      ],
      [
        "01:30:00",
        6.3
      ],
      [
        "01:45:00",
        4.1
      ],
      [
        "02:00:00",
        4.5
      ],
      [
        "02:15:00",
        7.3
      ],
      [
        "02:30:00",
        6.1
      ]
    ]
  },
  {
    "Station": "Station2",
    "Date": "23-10-2018",
    "Temps": [
      [
        "01:30:00",
        6.3
      ],
      [
        "01:45:00",
        4.1
      ],
      [
        "02:00:00",
        4.5
      ],
      [
        "02:15:00",
        7.3
      ],
      [
        "02:30:00",
        6.1
      ]
    ]
  }
]
4 年前
回复了 Tim Roberts 创建的主题 » 试着用python制作一个线条投射器

这是你在两点之间划一条线的方法。这是基于Bresenham的算法。你知道哪个方向变化最大,这就是你的“主要”方向。然后,在每一步,你都会朝着主方向移动一个。你保留一个“误差项”,它跟踪你需要在“小”方向上移动多远,当它穿过整个单元时,你也会在小方向上移动。还要注意的是,在numpy术语中,Y坐标(行)应始终位于第一位。

import cv2 as cv
import numpy as np
dim_x = 50
dim_y = 50

x1,y1 = (8,8)
y2,y2 = (40,30)

# Are we increasing in X?

deltax = x2 - x1
deltay = y2 - y1

dirx = 1 if deltax > 0 else -1
diry = 1 if deltay > 0 else -1

# Which direction is major?

if deltax > deltay:
    steps = deltax
    xmajor = 1
else:
    steps = deltay
    xmajor = 0

error = 0

pic = np.zeros((dim_y,dim_x))
pic[y1,x1] = 255
pic[y2,x2] = 255
for count in range(steps):
    if xmajor:
        x1 += dirx
        error += deltay
        if error >= deltax:
            y1 += diry
            error -= deltax
    else:
        y1 += diry
        error += deltax
        if error >= deltay:
            x1 += dirx
            error -= deltay
    pic[y1,x1] = 255
    print(x1,y1)
cv.imwrite("frame.png", pic)
3 年前
回复了 Tim Roberts 创建的主题 » 在python-NumPy中,输出结果为“-”

文件上说,“两者都不是 r1 也没有 r2 应该有副本吗 key :重复的存在将使输出非常不可靠。请注意,算法不会查找重复项。".

http://pyopengl.sourceforge.net/pydoc/numpy.lib.recfunctions.html

熊猫有一个更传统的连接功能,如果你想走那么远的话。

3 年前
回复了 Tim Roberts 创建的主题 » python:从JSON中提取所有特定的子键

应该清楚地知道如何扩展现有资源。看在上帝的份上,不要多次重复JSON加载。

data = json.loads(children.text)
firstNames = [k['firstname'] for k in data['children']]

分块上传的开销更大,因此它们只允许上传大于20MB的文件。对于较小的文件,请使用普通 upload 应用程序编程接口。事实上,他们推荐正常的 上载 高达50MB。

你需要从函数中返回一些东西。然后,当递归返回时,需要将这个(最低有效)数字添加到从父级得到的数字中。

def decimalToBinary(num):
    s = ''
    if num > 1:
        s = decimalToBinary(num // 2)
    return s + str(num%2)
number = int(input("Enter any decimal number:"))
print(decimalToBinary(number))
3 年前
回复了 Tim Roberts 创建的主题 » Python urllib3似乎没有发送字段数据

你告诉它,数据将以URL编码的形式出现,但事实并非如此 request 默认情况下是这样的。我相信你需要:

resp = http.request(
        "POST",
        "https://core.syhapp.com/hpca/oauth/token",
        fields={
            "grant_type": "client_credentials",
            "client_id": "YYYYYYYYY",
            "client_secret": "XXXXXXXXX"
        },
        encode_multipart = False
    )

要求 取代 Content-Type 标题,所以根本没有必要指定它。

3 年前
回复了 Tim Roberts 创建的主题 » Python-打印创建对象时调用了哪些dunder方法

__call__ 只是对象创建的间接部分。你的例子并不像你想象的那样——它没有调用 dict.__call__ .只有你这么做了才会打电话 x() 哪里 x 是一个 dict 例子

字典 恰好是一个对象本身,类型 class 这个 类型有一个 __打电话__ 方法,它允许您编写 x = dict() 这个 class.__call__ 方法触发对象创建。

对象创建包括 __new__ __init__ .

您的列表数据中有错误。我将字符串“],”替换为字符串“],\n”,以便查看结构。第30条输入错误:

...
['2022-04-01T14:00:00Z', '2022/04/01 00:58:53', '-', 'Csm Slatina', 'ACS Vedita Colonesti MS', '-', '-', '-', '-', '-'],
['2022-04-01T14:00:00Z', '2022/04/01 00:58:53', '-', 'CSM Flacara Moreni', 'ACS FC Academica Clinceni 2', '-', '-', '-', '-', '-'],
[2.36, '-'],
['2022-04-01T14:00:00Z', '2022/04/01 00:58:55', '-', 'Dinamo Bucuresti II', 'CS Real Bradu', 1.93, '-', '-', '-', '-'],
['2022-04-01T14:00:00Z', '2022/04/01 00:58:56', '-', 'FCSB II', 'FC Arges II', '-', '-', '-', '-', '-'],
...

如果你修正了数据,它的排序就会很好。

改善效果追踪

你可以通过

para_planiha = [k for k in para_planiha if len(k) > 2]
3 年前
回复了 Tim Roberts 创建的主题 » 打字机效果tkinter python

tkinter 与所有GUI框架一样,是事件驱动的。当你创建这些标签或采取任何行动时,都不会立即采取任何行动。所做的就是发送消息。这些消息将一直排在消息队列中,直到您到达 mainloop .主循环调度并处理所有这些消息,从而采取行动。

所以,在运行循环时,屏幕上什么都没有。你所做的只是将时间延迟到主窗口设置完毕。

所以,你需要做的是使用 win.after 每0.2秒请求一次回调。在该回调中,您将添加下一个字符,并请求另一个回调。你一次做一个。我会创建一个包含要显示的字母的全局列表。每次通话消耗一个字母,直到列表为空。

to_be_drawn = []

def callback():
    if not to_be_drawn:
        return
    nxt = to_be_drawn.pop(0)
    ab.set( ab.get() + nxt )
    win.after( 200, callback )

def start_typing(text):
    was_empty = not to_be_drawn
    text = text.replace('[','').replace(']','').replace(',','')
    to_be_drawn.extend( list(text) )
    if was_empty:
        win.after( 200, callback )

start_typing( "Hello, kitty!" )
def get_level(s):
    return s.count('-')

def translate(test_list):
    seg_ids = []
    levels = [0]*9
    last_level = 99
    for an_ele in test_list:
        level = get_level(an_ele)
        if level <= last_level:
            levels[level] += 1
        else:
            levels[level] = 1
        seg_ids.append( '_'.join(str(k) for k in levels[:level+1]))
        last_level = level
    return seg_ids

print(translate(['heading', 'heading','sub-heading', 'sub-heading', 'heading', 'sub-heading', 'sub-sub-heading', 'sub-sub-heading', 'sub-heading', 'sub-heading', 'sub-sub-heading', 'sub-sub-heading','sub-sub-heading', 'heading']))

输出:

['1', '2', '2_1', '2_2', '3', '3_1', '3_1_1', '3_1_2', '3_2', '3_3', '3_3_1', '3_3_2', '3_3_3', '4']

这将最大级别数固定为9。你可以通过设置 levels=[0] 然后,如果新的水平已经超过了终点,那么就扩展它,但这一点得到了理解。

3 年前
回复了 Tim Roberts 创建的主题 » 函数调用期间未调用Python input()

看看这句话:

input_check("Do you know the rules?\n", rules(), "Ok. Starting game...")

当您这样做时,Python将调用 rules 立即运行,以便将结果传递给 input_check 你的 规则 函数打印出一堆东西,然后有完全相同的行,这将调用 rules() 一次又一次,一次又一次,一次又一次。。。它从来没有机会打电话 输入检查 .它还在处理参数。

如果要传递函数对象但不调用它,请不要使用参数:

input_check("Do you know the rules?\n", rules, "Ok. Starting game...")

请注意 输入检查 函数将继续调用传入的函数。你不需要在里面再打电话 规则 .

改善效果追踪

这和你想的不一样:

  if yes_no.lower() == "n" or "no":

解析为:

  if (yes_no.lower() == "n")   or "no":

既然“不”是真的,那么if将永远被接受。您应该使用以下选项之一:

  if yes_no.lower() in ("n" or "no"):
  if yes_no.lower()[0] == "n":

接下来,你有这个:

  if yes_no.lower() == "n" or "no":
    function

在这里,您确实想调用函数,因此需要添加参数:

  if yes_no.lower()[0] == "n":
    function()
3 年前
回复了 Tim Roberts 创建的主题 » 将字典的键名提取到列表| python中|

这将创建一个dict列表和一个包含键的列表。这就是你想要的吗?

import json

jdata = json.loads(data)
jheader = []
jrows = []
for key,parts in jdata.items():
    if not jheader:
        jheader = list(parts[0].keys())
    jrows.extend(parts)
3 年前
回复了 Tim Roberts 创建的主题 » 我下面的python合并排序代码有什么问题?

修复索引后,还有其他问题。“Mergesort”应该就地进行排序,修改原始列表。你没有那样做;你在试图建立一个新的列表。这意味着您需要返回已创建的列表,并在下一步中使用它。

然后, c 不能是全球性的。它是“merge”函数的本地调用,因此每个调用都有自己的副本。最后,每个合并步骤只处理列表的一部分。你必须复制你没有改变的部分。这似乎有效:

def mergesort(a,low,high):
    if low<high:
        mid=(high+low)//2
        a = mergesort(a,low,mid)
        a = mergesort(a,mid+1,high)
        a = merge(a,low,mid,high)
    return a
def merge(a,low,mid,high):
    c = a[:low]
    i=low
    j=mid+1
    while i<=mid and j<=high:
        if a[i]<=a[j]:
            print(a[i])
            c.append(a[i])
            i+=1
        else:
            print(a[i])
            c.append(a[j])
            j+=1
    c.extend( a[i:mid+1] )
    c.extend( a[j:] )
    return c

a=[4,2,7,0,9,6,5]
c = mergesort(a,0,len(a)-1)
print(c)